sql-server - 如何跨多个表强制执行 CHECK 约束

标签 sql-server database tsql check-constraints

我在 Microsoft SQL Server 2012 Express 中有一个记录奶牛繁殖信息的数据库。很明显,一头牛要到出生后才能配种,而且一生中可能配种多次;我需要在我的数据库中强制执行这些约束。我目前根据下图安排了一个架构:

Cow Database Schema Diagram

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/

相关文章:

javascript - 使用 AJAX 根据 Codeigniter 中的下拉值获取数据库值

sql - 如何知道应该在哪里使用 AS 关键字?

sql - 如何列出 SQL Server 表的主键?

sql - 在什么情况下可以使用 T-SQL GOTO 语句?

sql-server - 在 SQL Server : how do I remove empty elements from nested elements when LEFT OUTER JOIN'ing 中使用 FOR XML AUTO 时

sql-server - 存储过程 - 返回标识作为输出参数或标量

sql-server - SQL Server 2008 中是否有外键索引

database - 如何找到候选键

SQL SSAS 计算成员显示#NUM!在立方体?

database - 如何通过 Cypher Neo4j 中的其他 Prop 对 Node Prop 的值进行分组?