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
これは、単一行の挿入と一行の更新で正常に動作します。マルチローの挿入と更新を処理するために、このコードを最適化することができません。これを処理するためのいくつかの助けを探しています。
ありがとうございました。
...私は以下のようにトリガを変更し、それが今で正常に動作しているようですか?トリガーの場合、MySQL、PostgreSQL、Oracle、SQL Server、またはIBM DB2を使用しているかどうかにかかわらず**大きな違いがあります。あなたの質問に関連タグを追加してください! –
** SQL Server **の場合は、トリガーに**主な**欠陥があります。**行ごとに** **これは** NOT **の場合です。 * INSERT文で25行が挿入された場合、トリガは** ** 1回実行され、 'Inserted'疑似テーブルには25行が含まれます。あなたのコードがここで選択する25行のうちどれですか? 'Select prkeyId FROM inserted' - 非決定論的ですが、**任意の行**を取得し、**すべての行を無視します**。これを考慮に入れてトリガーを書き直す必要があります。 –
不完全な情報を申し訳ありません。データベースはSQL Serverであり、トリガーが文ごとに起動することを認識しました。私は特定の基準(recEditMode = 'MANUAL')を満たすすべての行を追跡し、それらを別のテーブルに記録しようとしていました。私はまた、私は複数のテーブルで同じトリガを使用するようにテーブル名をキャプチャする必要があります。これに新しいので、私は影響を受けるすべての行を説明するトリガーを書き換えるためのいくつかの助けを探していた。 – user2208460