2013-03-15 3 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

Если можно, основываясь на имени вашего ограничения, вы пытаетесь гарантировать, что есть только одна программа на тест? Если и программа, и тест доступны в той же таблице, добавьте уникальное ограничение.