1

以下のサンプルフォーマットテーブル構造があります。

CUSTOMERテーブル

CUSTID INT,//PRIMARY KEY
CUSTDATA VARCHAR

EMPLOYEEテーブル

EMPID INT,//PRIMARY KEY
EMPDATA VARCHAR

ITEMテーブル

ITEMID INT,//PRIMARY KEY
CUSTID INT,//REFERENCE KEY
ITEMTYPE INT //1 FOR CUSTOMER AND 2 FOR EMPLOYEE
EMPID INT

MERGEDATAテーブル

MERGEID INT,
CUSTDATA VARCHAR,
EMPDATA VARCHAR
ACTION VARCHAR

上記には4つのテーブル(CUSTOMER, EMPLOYEE, ITEMと)があり、イベントのテーブルにMERGEDATASQL Serverトリガーを作成したいので、テーブルでアクティビティが実行されるたびに、テーブルで実行されたアクションがテーブルに入力されます。ITEMINSERT/UPDATE/DELETEITEMMERGEDATAITEM

したがって、新しい行がテーブルに挿入されると、またはエントリに応じてITEM新しいエントリがテーブルに挿入されます。たとえば、顧客からのエントリがある場合は、テーブルとテーブルに次のように1つのエントリが追加されます。MERGEDATACUSTOMEREMPLOYEEITEMCUSTOMER

CUSTOMERテーブル

123, TESTCUSTOMER

ITEMテーブル

1, 123, 1, 0

Employeeテーブルについても同じことが言えますが、ITEMテーブルの行はのようになります1, 456, 0, 2

ここで、トリガーのif条件に、CUSTOMERテーブルからのエントリがある場合を記述したいと思います。

IF (ITEMTYPE == 1)
//Entry in MERGEDATA will as below

MERGEDATAテーブル

1, 123, 0, ACTION (will depend on type of trigger event trigger if INSERT(ACTION = INS), for update (UPDATE = UPD) etc

要するに、私は引き金で物事の下を見ています:

  • トリガーにIF条件を書き込む方法
  • トリガーで他のテーブルから内部結合を行う方法

提案してください!!

ありがとう

4

1 に答える 1

0

私の提案は次のようになります:

操作ごとに1つずつ、 3つの個別のトリガーを作成します。これにより、の決定が容易になりAction、各操作を個別にオン/オフにする柔軟性も得られます。さらに、トリガーコードはより小さく、理解しやすく、保守しやすくなります。

その設計を考えると、トリガーは非常に単純になります。

CREATE TRIGGER trg_Item_Insert 
ON dbo.Item FOR INSERT
AS 
   -- first insert customer-related data - if any
   INSERT INTO dbo.MergeTable(CUSTDATA, EMPDATA, ACTION)
      SELECT CustData, EmptyData, 'INSERT'
      FROM Inserted
      WHERE ITEMTYPE = 1

   -- then insert employee-related data - if any
   INSERT INTO dbo.MergeTable(CUSTDATA, EMPDATA, ACTION)
      SELECT CustData, EmptyData, 'INSERT'
      FROM Inserted
      WHERE ITEMTYPE = 2

3つの個別のトリガーを作成する場合は、それらの他のトリガーの'INSERT'値をAction'Update'に置き換えるだけです。'Delete'

私が困っているのは:

  • どの列のどの列Itemをどの列に格納する必要がありますMergeDataか?
  • あなたの列ItemまたはほとんどINT-あなたの列MergeDataVarchar-ここでどのような「変換」を適用したいですか?

詳細については、次の優れたSQL Server Books Onlineドキュメント(無料で入手可能!)を参照してください。CREATE TRIGGER

于 2013-01-15T05:59:44.703 に答える