2016-07-07 12 views
0

複数の表の挿入と更新を追跡し、ログ表に記録するには、次のトリガーを使用しています。複数の行の挿入と更新を処理するためのトリガー

CREATE TRIGGER tr_TestTable1] 
ON [TestTable_1] 
AFTER INSERT, UPDATE 
AS 
DECLARE @keyid int, @tn nvarchar(50), @recEditMode nvarchar(50), @trstat nvarchar(50) 
BEGIN 
    SET NOCOUNT ON; 
    SET @tn = 'TestTable_1' 
    IF EXISTS(SELECT 1 FROM INSERTED) 
    BEGIN 
    SET @recEditMode = (Select REC_EDIT_MODE FROM inserted) 
    SET @trstat = 'PENDING' 
    SET @keyid = (Select prkeyId FROM inserted) 

    IF (@recEditMode = 'MANUAL') 
    BEGIN 
    IF NOT EXISTS (SELECT * FROM [logTable_1] WHERE SourceKeyId = @keyid AND TrStatus = 'PENDING' AND SourceTableName = @tn) 
     BEGIN 
      INSERT INTO [logTable_1](SourceKeyId,SourceTableName,TrStatus) 
       VALUES (@keyid, @tn, @trstat)  
     END 
    END 
     END 

END 

これは、単一行の挿入と一行の更新で正常に動作します。マルチローの挿入と更新を処理するために、このコードを最適化することができません。これを処理するためのいくつかの助けを探しています。

ありがとうございました。

+0

...私は以下のようにトリガを変更し、それが今で正常に動作しているようですか?トリガーの場合、MySQL、PostgreSQL、Oracle、SQL Server、またはIBM DB2を使用しているかどうかにかかわらず**大きな違いがあります。あなたの質問に関連タグを追加してください! –

+2

** SQL Server **の場合は、トリガーに**主な**欠陥があります。**行ごとに** **これは** NOT **の場合です。 * INSERT文で25行が挿入された場合、トリガは** ** 1回実行され、 'Inserted'疑似テーブルには25行が含まれます。あなたのコードがここで選択する25行のうちどれですか? 'Select prkeyId FROM inserted' - 非決定論的ですが、**任意の行**を取得し、**すべての行を無視します**。これを考慮に入れてトリガーを書き直す必要があります。 –

+0

不完全な情報を申し訳ありません。データベースはSQL Serverであり、トリガーが文ごとに起動することを認識しました。私は特定の基準(recEditMode = 'MANUAL')を満たすすべての行を追跡し、それらを別のテーブルに記録しようとしていました。私はまた、私は複数のテーブルで同じトリガを使用するようにテーブル名をキャプチャする必要があります。これに新しいので、私は影響を受けるすべての行を説明するトリガーを書き換えるためのいくつかの助けを探していた。 – user2208460

答えて

0

RDBMSはこのです

CREATE TRIGGER tr_TestTable1] 
    ON [TestTable_1] 
    AFTER INSERT, UPDATE 
    AS 
    DECLARE @keyid int, @tn nvarchar(50), @trstat nvarchar(50) 
    BEGIN 
     IF @@ROWCOUNT = 0 
     RETURN 
     SET NOCOUNT ON; 
     IF EXISTS(SELECT * FROM INSERTED) 
     BEGIN 
     SET @tn = 'TestTable_1' 
     SET @trstat = 'PENDING' 
     BEGIN 
     INSERT INTO LogTable_1 (SourceKeyId, SourceTableName, TrStatus) 
     SELECT I.prKeyId, @tn, @trStat FROM INSERTED AS I 
     WHERE (I.REC_EDIT_MODE = 'MANUAL' AND NOT EXISTS(SELECT * FROM LogTable_1 WHERE SourceKeyId = I.prKeyId AND SourceTableName = @tn AND TrStatus = 'PENDING')) 

     END 
    END 
END 
関連する問題