У меня есть база данных, которая записывает информацию о разведении коров в Microsoft SQL Server 2012 Express. Очевидно, что корову нельзя разводить до тех пор, пока она не родится, и ее можно разводить несколько раз в течение жизни; и мне нужно применить эти ограничения в моей базе данных. В настоящее время я организовал схему в соответствии со следующей диаграммой:
DataID
— первичный ключ для всех животных. Я попытался реализовать наследование Table-Per-Type, следовательно, отношение 1-к-1 между [Animals].[Master]
и [Animals].[Females]
. Поскольку каждую самку можно скрещивать несколько раз, я установил отношение 1 ко многим между [Animals].[Females]
и [Breedings].[Breedings]
.
Мой вопрос: как я могу применить правило, согласно которому для всех женщин BirthDate
‹ Breedings.Date
?
По сути, мне нужно что-то вроде следующего псевдокода (который я фактически поместил в поле «выражение» ограничения CHECK и получил ошибку проверки):
[Animals].[Master].[BirthDate] < [Breedings].[Breedings].[Date]
INNER JOIN [Animals].[Master] ON
[Breedings].[Breedings].[DataID] = [Animals].[Master].[DataID]
Я также попытался создать представление с правильным соединением, но обнаружил, что ограничения CHECK нельзя использовать в представлениях.
Итак, кто-нибудь знает, как я могу обеспечить соблюдение этих ограничений?
EDIT. Я попробовал использовать триггеры, но не смог правильно сформулировать синтаксис триггера. Вот мой код:
USE [CowInventory];
GO
CREATE TRIGGER [Breedings].[iCheckBreedingDateAfterBirthDate]
ON [Breedings].[Breedings]
FOR INSERT
AS
BEGIN
DECLARE @CowID UniqueIdentifier
SELECT @CowID = DataID FROM inserted;
DECLARE @CowBirthDate Date
SELECT @CowBirthDate = BirthDate FROM [Animals].[Master] WHERE [Master].[DataID] = @CowID
DECLARE @BreedingDate Date
SELECT @BreedingDate = Date FROM inserted;
IF(@CowBirthDate > @BreedingDate)
BEGIN
THROW;
END
END
Согласно моей книге (SQL Server 2012 Step by Step), этот синтаксис должен работать идеально. Но вместо этого SQL Server дает мне розовые строки под THROW
и последними END
, указывающими Incorrect syntax near 'THROW'. Expecting CONVERSATION, DIALOG, DISTRIBUTED, or TRANSACTION.
и Incorrect syntax near 'END'. Expecting CONVERSATION.
. Я вставил эти ключевые слова, но они ничего не меняют.