我的数据库中的表有一个检查约束。我对检查的理解是它设置了一个逻辑条件,对于表中的记录必须为true。
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
可能会发生什么?
答案 0 :(得分:4)
出于这个原因,请注意在检查约束中使用UDF。 This blog post describes your issue.总结一下:
只要你INSERT
进入,表面就会完成它的工作(一个UDF) 表。但是如果你更新一行而只为某些行设置了otherColumn 行从0到1,然后不检查检查约束。优化器足够聪明,可以理解更新不会改变我们在CHECK约束中引用的任何内容,为什么 麻烦检查约束?
这里的最终结果是约束不能达到我们想要的效果 做。 使用触发器(或其他方法)。
(强调补充)
答案 1 :(得分:0)
如果可以,根据您的约束名称,您是否尝试确保每个测试只有一个程序?如果程序和测试在同一个表中都可用,请添加唯一约束。