【发布时间】:2017-06-07 19:29:34
【问题描述】:
我有一个记录表
ID
EntityID
Value
Status
还有一个实体表
ID
Col1
Col2
CurrentRecordID
CurrentRecordID 应该是与Entity 绑定的Record,Status 为 0
我有两个检查约束
表Entity 上的一个检查以确保CurrentRecordID 实际上是当前记录,Record 上的一个检查以确保如果状态为0,则其EntityID 具有@987654331 @ 匹配其 ID。
所以本质上,这两个检查约束做同样的事情,但分别在每个表上
检查约束是在事务的最后运行还是在每次插入/更新表后像触发器一样运行?
如果它们在每次修改后运行,这两个约束是否会相互冲突(也就是说,约束会在下一个表有机会更新其值之前抛出错误)。
这是一个运行以插入新记录并将其设置为给定实体的当前记录的查询示例
UPDATE Record SET Status = 1 WHERE Status = 0 AND EntityID = @EntityID
INSERT INTO Record(EntityID, Value, Status) VALUES(@EntityID, 100, 0)
DECLARE @RecordID INT = @@IDENTITY
UPDATE Entity SET CurrentRecordID = RecordID WHERE ID = @EntityID
【问题讨论】:
-
约束不像触发器那样运行。他们在对数据进行更改之前评估规则。我还告诫不要使用@@IDENTITY,您应该改用SCOPE_IDENTITY。如果 Record 表上有一个触发器插入到另一个具有标识的表中,您将收到该值,而不是您认为的值。
-
@SeanLange 所以流程是
Table 1 Change -> Check Constraint Table 1 -> Table 2 Change -> Check Constraint Table 2即使他们在同一个事务中,对吗?此外,查询只是一个示例,我实际上为此使用实体框架,但无论如何感谢! -
没错。尝试更改数据时会发生约束检查。如果对 Table1 的尝试更改未通过检查约束,它将通过异常。
-
@SeanLange 太好了,谢谢。我最终使用计算列来解决我的问题。如果你想用你的解决方案来回答,我很乐意接受。
标签: sql-server check-constraints