0

私はトレーニング期間中で、トレーナーがデータベースの演習をいくつか教えてくれました。

ProjectEmployeeRoles、およびEmployee_Projects_Roleテーブルを作成する必要があります。最後のテーブルには、特定の役割を持つプロジェクトに取り組んでいる従業員の詳細が含まれています。

彼が私に与えた条件は次のとおり
です。 1. 1 人の従業員が複数のプロジェクトで働くことができます。
2. 1 人の従業員が同じプロジェクトで異なる役割を持つことはできません。

それらのテーブルを作成し、データを挿入しました。役割では、リーダー、マネージャー、開発者の役割がありました。それらの表を作成し、データを入力しました。

彼は私のテーブルをチェックし、プロジェクトには複数のリーダーと 1 人のマネージャーがいると言ったので、1 つのプロジェクトに同じ役割がないように列を制限しましたが、1 つのプロジェクトでそのマッピング テーブルに 2 人の開発者を入力することはできません。

しかし、プロジェクトには明らかに 2 人の開発者がいる場合があります。それで、あなたがシナリオ全体を理解しているなら、1 つのプロジェクトで 1 人のリーダーとマネージャーしか持たないという特定の列を制限することは可能ですか?

私はデータベースにはあまり興味がありませんが、私にプロジェクトの仕事を割り当てる前に、彼は私の基本をブラッシュアップしたいと思っています。だから、私はそれで本当に混乱しています。

これらのテーブルのスキーマは次のとおりです。

  1. 次のフィールドを持つプロジェクト: project_pid - 主キー、project_name

  2. 次のフィールドを持つ従業員: employee_pid - 主キー、employee_name、gender - M/F、salary、date_of_joining、is_active - Y/N

  3. 次のフィールドを持つロール:
    role_pid - 主キー、role_name - (チーム メンバーまたはリーダー)

  4. 次のフィールドを持つ Employee_Project_Role:
    project_xid - 外部キー (参照テ​​ーブル Projects)、employee_xid - 外部キー (参照テ​​ーブル Employee)、role_xid - 外部キー (参照テ​​ーブル Roles)

4

2 に答える 2

2

このようなロジックを実装するには、手続き型言語を使用する必要があります。私の意見では、トリガーを定義するのが最も簡単な方法です。

CREATE TRIGGER role_restrict
ON employee_project_role
FOR INSERT, UPDATE
AS
  BEGIN
      DECLARE @role VARCHAR(100)
      DECLARE @ldr_xid VARCHAR(100)

      SELECT @role_xid = (SELECT role_xid
                          FROM   inserted)

      SELECT @ldr_xid = (SELECT role_xid
                         FROM   roles
                         WHERE  role_name = "leader")

      IF @role = @ldr_xid
         AND (SELECT Count(*) AS cnt
              FROM   employee_project_role
              WHERE  project_xid = (SELECT project_xid
                                    FROM   inserted)
                     AND role_xid = @ldr_xid) > 1
        /* Cancel the insert, there is already a leader in a project.*/
        BEGIN
            ROLLBACK TRANSACTION
        END
  /* Otherwise we insert the record */
  END  
于 2012-09-15T08:13:25.023 に答える
1

「プロジェクトごとに 1 つのロール」という制限を削除し、代わりに T-SQL ストアド プロシージャを作成して、プロジェクトの従業員を挿入および更新する必要があります。

基本的に、テーブルとリレーションシップでは、この種の複雑な動作は許可されません。リンク テーブルを作成するか (マネージャーが許可していません)、ロジックを T-SQL ストアド プロシージャにコーディングする必要があります。

T-SQL プロシージャを使用すると、次のロジックを実行できます。

//疑似コード

IF newEmployeeToBeInserted.IsManager AND Project_table.ContainsManager
return errorCode
ELSE doInsert
于 2012-09-15T07:53:56.853 に答える