2

我的数据库中的表有一个检查约束。我对检查的理解是它为表中的记录设置了一个逻辑条件,该条件必须为真。

USE [myDB]
GO

ALTER TABLE [dbo].[myTable]  WITH CHECK ADD  CONSTRAINT [oneProgramPerTest] CHECK  (([dbo].[howManyProgPerTest]([TestId])<(2)))
GO

ALTER TABLE [dbo].[myTable] CHECK CONSTRAINT [oneProgramPerTest]
GO

但我能够对打破约束的表进行更新。更新后,此查询返回 9 条记录:

select COUNT (*) from myDB.dbo.myTable where myDB.[dbo].[howManyProgPerTest](testID)>1

可能会发生什么?

4

2 回答 2

4

出于这个原因,请注意在检查约束中使用 UDF。 这篇博文描述了您的问题。总结一下:

(一个UDF)会在表面上做它的工作,只要你INSERT进入表。但是如果你更新了一行并且只将某行的 otherColumn 设置为 0 到 1,那么检查约束将不会被检查。

优化器足够聪明,可以理解更新不会改变我们在 CHECK 约束中引用的任何内容,那么为什么还要检查约束呢?

这里的最终结果是约束没有做我们希望它做的事情。改用触发器(或其他方法)

(重点补充)

于 2013-03-15T17:26:16.020 回答
0

如果可以,根据您的约束名称,您是否试图确保每次测试只有一个程序?如果程序和测试在同一个表中可用,则添加唯一约束。

于 2013-03-15T23:05:31.073 回答