2013-03-15 79 views
2

我在我的数据库中的表上有一个检查约束。我对检查的理解是它为表中的记录设置了一个合理的条件。为什么t-sql允许我违反使用UDP的检查约束?

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

由于这个原因,谨防在检查约束中使用UDF。 This blog post describes your issue.总结:

(A UDF)将在表面上做的工作,只要你INSERT到 表。但是,如果更新一行并仅将其他列设置为从0到1的 行,则不会检查检查约束。

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

这里最终结果就是约束不会做我们想要的 做的。 改用触发器(或其他方法)

(强调)

0

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