2012-04-27 11 views
3

テーブルに制約を適用することに関して質問があります。 私はworksonというテーブルとstaffというテーブルを持っています。各スタッフは特定のタイトル(スーパーバイザー、承認者、マネージャーなど)を持っています。スーパーバイザーとオーソライザーがworkson table上の同じスタッフになれないようにする必要があります。それらの間の基数は多くのものか​​ら多数です。私はそれを行う方法がわかりません。 この問題を解決するようアドバイスできますか?sqlで制約を適用する方法は?

おかげ

+0

どのDBMS? SQL Server/Oracleなど – Bridge

答えて

0

は、次のクエリ

SELECT AssignmentNo, StaffNo 
    FROM worksOnStaff 
WHERE StaffType = 'supervisor' 
INTERSECT 
SELECT AssignmentNo, StaffNo 
    FROM worksOnStaff 
WHERE StaffType = 'authorizer' 

を考えてみましょうセットie

CHECK (NOT EXISTS (SELECT AssignmentNo, StaffNo 
         FROM worksOnStaff 
         WHERE StaffType = 'supervisor' 
        INTERSECT 
        SELECT AssignmentNo, StaffNo 
         FROM worksOnStaff 
         WHERE StaffType = 'authorizer')); 

問題は、CHECKという制約でサブクエリを許可するSQL製品がほとんどないことです。

通常の回避策は、同じロジックを手続きコードに含めることです。トリガを使用するか、または制約に違反しないことを保証するストアドプロシージャを介してユーザーにデータを更新させる(ベーステーブルの更新権限を削除することによって)。全体を接着剤のように動かすことなく、アップデートを適切にシリアル化するよう注意しなければなりません。

幸いなことに、テーマに関する優れた著書があります:

Applied Mathematics for Database Professionals By Lex de Haan, Toon Koppelaars

DBMSに宣言することはできません制約を実装するためには、我々はトリガ手続き戦略に従うことを好む...などが宣言しますトリガされた手続き戦略は転覆できません。 ...より管理しやすいコード・アーキテクチャーを作成する可能性があります...しかし、トリガーを介してこれらの制約のための効率的なデータ保全コードを実装することは、些細な作業ではありません... しかし、オントランジションエフェクト・プロパティプラス最適化 - クエリ

  1. 正式な翻訳:定期的にそうすることで 堪能になって、手続きテーブル制約を実装することは一般的な、非常に なんとか...

    実行モデルEM6であります仕様を制約検証クエリに変換する。

  2. 遷移効果を維持するコードを作成します。
  3. 制約の検証クエリが実行されることを保証する遷移効果(TE)クエリのデバッグは、 が必要な場合にのみ実行されます。
  4. TEクエリ に検証クエリで使用できる値を指定することによって、制約の検証クエリを最適化する手段を発見します。
  5. データ整合性(DI)コードを作成してシリアル化戦略を追加します。

彼らは、他のSQL製品に移植することができますOracleでこのような戦略を実装する方法についての完全な詳細を与えます。

0

データベースによっては、チェック制約をサポートしています。あなたの制約satisifesテーブル内のデータは、上記のクエリは空になりますとき

CREATE TABLE workson 
(
    rowId int NOT NULL, 
    supervisorId int NOT NULL, 
    authorizerId int NOT NULL, 
    -- ... 
    CONSTRAINT chk_Uniqueness CHECK (supervisorId != authorizerId) 
) 
+0

応答に感謝しますが、テーブルにはstaffId属性しかありません。スタッフタイトルはスタッフの役割を定義します。 – user1360341

+0

@ user1360341 - あなたが本当に欲しいものが分からない。あなたはテーブル構造を投稿してください。 – mrab

+0

私のテーブルスキーマはhttp://sqlhelp1.blogspot.com.au/です。私は監督者と認可者が与えられた仕事のために同じスタッフになれないようにする必要があります。 – user1360341

関連する問題