1

許容値の範囲がハードコーディングせずに別のテーブルから取得されるように、列にCHECK制約を設定するにはどうすればよいですか?

簡単な例を次に示します。

OneManyTable
RoleID  TaskID
10      Val1
10      Val2
20      Val1
20      Val2


MetaDataTable
pkID    Class   Value
1       A       Val1
2       A       Val2
3       B       Val3
4       B       Val4

OneManyTable.TaskID列にCHECK制約を設定して、受け入れ可能な値が別のテーブルの列、つまりMetadataTable.Value(MetadataTable.class ='A')から取得されるようにします。

私はすでにフォーマットのチェック制約を作成しようとしました

TaskID in (Select Value FROM MetadataTable where class= 'A')

しかし、これはサポートされていません。

一方、('Val1'、'Val2')のTaskIDは、SQL2k8(SQL2000ではありません!)ではチェック制約として機能しますが、ハードコーディングのために受け入れられません。

CHECK制約または私が気付いていない他のいくつかの派手なメカニズムを介して、私が望むものを達成する方法は?

PS。データベース側である必要があります。誰かが私に提案したようなクライアント側のチェックはありません。

4

2 に答える 2

4

始めるのはおそらく良い習慣ではありませんが、TaskIDをパラメーターとして受け入れ、TaskIDがMetaDataTableで提供される範囲内にあるかどうかに応じて、trueまたはfalseに評価するユーザー定義関数を作成できます。

これにより、探している機能を利用できるようになります-CHECK制約は、実際には列の範囲を制限するように設計された単純な関数であり、その動作はそれを念頭に置いて設計されているため、できないのはそのためです。 SQLサーバーのチェック制約内にサブクエリを書き込みます。

ただし、ユーザー定義関数内にSELECTステートメントを記述し、それをCHECK制約から呼び出すことができます。

于 2010-07-08T05:13:48.323 に答える
2

別のテーブルの値に対するCHECK制約は、通常、外部キー制約として設計されます。これは、テーブルを値にリンクするために設計されたメカニズムです。

CHECK制約は、実際には定義するためだけに設計されています

  • 最小値または最大値
  • 範囲
  • 与えられた値のセットの列挙

ですから、あなたがやろうとしていることをあなたができるとは思いません。なぜなら、それはあなたがそのために使おうとしている本当に間違った機能だからです。

于 2010-07-08T05:11:47.377 に答える