SQL Serverでは、特定の列が更新されたときにのみコードを実行するDMLトリガーを作成できます。
トリガーは引き続き起動しますが、特定の列が更新されたかどうかをテストし、その列が更新された場合にのみコードを実行できます。
これは、UPDATE()
を使用して行うことができます トリガー内で機能します。この関数は、引数として列名を受け入れます。ブール値を返します。
例
表は次のとおりです:
CREATE TABLE t1 (
id int IDENTITY(1,1) NOT NULL,
c1 int DEFAULT 0,
c2 int DEFAULT 0,
c3 int DEFAULT 0
);
そして、これがトリガーです:
CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE (c1) )
BEGIN
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;
この例では、t1
というテーブルを作成します trg_t1
というトリガー 。
IF
を使用しています UPDATE()
とともにステートメント c1
かどうかをテストする関数 列が更新されました。
トリガーが実行されると、その条件が真の場合にのみ後続のコードが実行されます。
トリガーを起動する
行を挿入しましょう。ただし、値はc1
にのみ挿入します。 列。
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
結果:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
予想どおり、トリガーが起動し、列c3
も更新されました。
これは、INSERT
を含めたために発生しました トリガーの定義の引数(つまり、AFTER INSERT, UPDATE
を指定しました これは、データが挿入または更新されるたびにトリガーが起動されることを意味します)。 AFTER UPDATE
のみを指定した場合 、データを挿入したときに起動しませんでした。既存のデータを更新するたびにのみ起動します。
テーブルはDEFAULT 0
で定義されていることに注意してください 、したがって、c2列はデフォルトでゼロになりました。
それでは、c1
を更新しましょう。 列。
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
繰り返しますが、c3
列はc1
とともに更新されました 。
それでは、c2
を更新してみましょう。 列(この列はトリガーに含まれていません)。
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 2 | +------+------+------+------+
今回はc2
更新されましたが、c3
そうではありませんでした。これは、c1
列は更新されておらず、トリガーはc3
のみを更新します c1
の場合 更新されます。
INSERT
でc1を指定せずに行を挿入した場合も、同じことが起こります。 ステートメント。
同じ値で列を更新するとどうなりますか?
同じ値で列を更新する場合、UPDATE()
関数はtrueを返します。
これが例です。
前の例から、c1列に2
の値が含まれていることがわかります。 。
その列を同じ値で明示的に更新しましょう:1
UPDATE t1
SET c1 = 2
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
だから今c3
c1
の値は増加しましたが、 まだ同じです。
もう一度やりましょう。ただし、今回はそれ自体に設定します(つまり、c1 = 1
を変更します。 c1 = c1
へ 。
UPDATE t1
SET c1 = c1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 4 | +------+------+------+------+
繰り返しますが、c3
増加しました。
更新の試行の失敗
UPDATE()
に注意することが重要です 関数は、INSERT
かどうかを示すだけです。 またはUPDATE
試行 テーブルまたはビューの指定された列で作成されました。試行が失敗した場合でも、trueが返されます。