为什么t-sql允许我违反使用UDP的检查约束?

时间:2013-03-15 17:04:57

标签: sql-server tsql check-constraints

我的数据库中的表有一个检查约束。我对检查的理解是它设置了一个逻辑条件,对于表中的记录必须为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

可能会发生什么?

2 个答案:

答案 0 :(得分:4)

出于这个原因,请注意在检查约束中使用UDF。 This blog post describes your issue.总结一下:

  只要你INSERT进入,表面就会完成它的工作(一个UDF)   表。但是如果你更新一行而只为某些行设置了otherColumn   行从0到1,然后不检查检查约束。

     

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

     

这里的最终结果是约束不能达到我们想要的效果   做。 使用触发器(或其他方法)

(强调补充)

答案 1 :(得分:0)

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