SQLServerにはUPDATE()
があります 特定の列が更新されているかどうかを確認するためにDMLトリガー内で使用できる関数。
この関数は1つの列のみを受け入れますが、複数のUPDATE()
を含めることを妨げるものは何もありません。 AND
を含む句 またはOR
複数の列の更新をテストします。
例
表は次のとおりです:
CREATE TABLE t1 (
id int IDENTITY(1,1) NOT NULL,
c1 int DEFAULT 0,
c2 int DEFAULT 0,
c3 int DEFAULT 0,
c4 int DEFAULT 0
);
そして、これがトリガーです:
CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE(c1) OR UPDATE(c2) )
BEGIN
UPDATE t1
SET c4 = c4 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;
この場合、c4
列は、c1
のいずれかである場合にのみインクリメントされます またはc2
列が更新されました。これは、これら2つの列の1つだけが更新された場合でも発生します(OR
を使用しているため) AND
とは対照的に 。
次に、c1
にデータを挿入してトリガーをテストしましょう 。
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
結果:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 0 | 0 | 1 | +------+------+------+------+------+
予想通り、c4
c1
のときにも更新されました 更新されました。
これは、c2
の場合にも適用されます 更新されます。
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 1 | 0 | 2 | +------+------+------+------+------+
そしてもちろん、両方が更新されたときにも適用されます。
ただし、しません c3
を更新する場合に適用します (ただし、c1
ではありません またはc2
)。
UPDATE t1
SET c3 = c3 + 1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 1 | 1 | 2 | +------+------+------+------+------+
両方の列を更新する必要があります
OR
を変更できます AND
c4
を指定します 列は、両方のc1
の場合にのみ更新されます および c2
更新中です。
これを指定するためにトリガーを変更しましょう:
ALTER TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE(c1) AND UPDATE(c2) )
BEGIN
UPDATE t1
SET c4 = c4 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;
次に、c1
を更新します のみ。
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 2 | 1 | 1 | 2 | +------+------+------+------+------+
したがって、c1
指定どおりに更新されましたが、c4
そうではありませんでした。
c2
を更新した場合も同じことが起こります ただし、c1
ではありません 。
しかし、今度は両方のc1
を更新しましょう および c2
。
UPDATE t1
SET c1 = c1 + 1, c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 3 | 2 | 1 | 3 | +------+------+------+------+------+
さすがに今回はc4
も更新されました。
失敗した更新
UPDATE()
に注意することが重要です 関数は、INSERT
かどうかを示すだけです。 またはUPDATE
試行 テーブルまたはビューの指定された列で作成されました。試行が失敗した場合でも、trueが返されます。
COLUMNS_UPDATED関数
複数の列にわたる更新を確認する別の方法は、COLUMNS_UPDATED
を使用することです。 機能。
この関数はvarbinaryを返します テーブルまたはビューの挿入または更新された列を示すビットパターン。
詳細については、COLUMNS_UPDATED
に関するMicrosoftのドキュメントを参照してください。 。