我在 Microsoft SQL Server 2012 Express 中有一个记录奶牛繁殖信息的数据库。很明显,一头牛要到出生后才能配种,而且一生中可能配种多次;我需要在我的数据库中强制执行这些约束。我目前根据下图安排了一个架构:
DataID
是所有动物的主键。我试图实现 Table-Per-Type 继承,因此 [Animals].[Master]
和 [Animals].[Females]
之间存在一对一的关系.由于每个雌性可能会多次繁殖,因此我在 [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]
我也尝试过使用正确的连接创建 View ,但发现不能在 View 中使用 CHECK 约束。
那么,有谁知道我可以如何执行这些约束?
编辑 - 我尝试了使用触发器的建议,但看不到正确制定触发器语法。这是我的代码:
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
下给我粉红色的线条,说明 'THROW' 附近的语法不正确。需要 CONVERSATION、DIALOG、DISTRIBUTED 或 TRANSACTION。
和 “END”附近的语法不正确。期待对话。
我已经插入了这些关键字,但它们没有任何改变。
最佳答案
我不会使用触发器。使用检查约束。干净多了。请记住检查约束可以调用函数。编写一个函数来检查另一个表。然后从检查约束调用函数。这是实现多表检查约束的最佳方式。
关于sql-server - 如何跨多个表强制执行 CHECK 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28172719/