テーブルに を定義するCHECK CONSTRAINT
と、保存されている条件句が入力したものと異なる場合があります。
例:
Alter table T1 add constraint C1 CHECK (field1 in (1,2,3))
保存されているものを見る:
select cc.Definition from sys.check_constraints cc
inner join sys.objects o on o.object_id = cc.parent_object_id
where cc.type = 'C' and cc.name = 'T1';
そうですか:
([field1]=(3) OR [field1]=(2) OR [field1]=(1))
これらは同等ですが、同じテキストではありません。BETWEEN
(句を使用する場合も同様の動作が発生します)。
これが起こらないことを望む理由はCHECK
、制約を定義するために使用するテキストと格納されているテキストを比較することにより、すべての制約が正しいことをプログラムで確認しようとしsys.check_constraints
ているためです。異なる場合は、制約を削除して再作成します。
ただし、これらの場合、それらは常に異なるため、プログラムは常に制約を再作成する必要があると考えます。
質問は:
- SQL Server がこの変換を行う既知の理由はありますか? 構文糖衣を少し取り除いて、句をより単純な形式で保存しているだけですか?
- この動作を回避する方法はありますか (SQL Server が変更するものと一致するように長い形式で制約句を記述する以外に) はありますか?
- チェック制約が「期限切れ」であり、再作成が必要かどうかを判断する別の方法はありますか?