2

DBのテーブルにチェック制約があります。チェックについての私の理解は、テーブル内のレコードに対して真でなければならない論理条件を設定することです。

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

制約の名前に基づいてよろしければ、テストごとに1つのプログラムしかないようにしようとしていますか? プログラムとテストの両方が同じテーブルで使用できる場合は、一意の制約を追加します。

于 2013-03-15T23:05:31.073 に答える