SQL Server memiliki UPDATE()
fungsi yang dapat Anda gunakan dalam pemicu DML untuk memeriksa apakah kolom tertentu telah diperbarui atau tidak.
Meskipun fungsi ini hanya menerima satu kolom, tidak ada yang menghentikan Anda untuk menyertakan beberapa UPDATE()
klausa dengan AND
atau OR
untuk menguji beberapa pembaruan kolom.
Contoh
Berikut tabelnya:
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
);
Dan inilah pemicunya:
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;
Dalam hal ini, c4
kolom akan bertambah hanya jika c1
atau c2
kolom telah diperbarui. Ini akan terjadi bahkan jika hanya satu dari dua kolom yang diperbarui (karena saya menggunakan OR
sebagai lawan dari AND
).
Sekarang mari kita uji pemicunya dengan memasukkan data ke c1
.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Hasil:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 0 | 0 | 1 | +------+------+------+------+------+
Seperti yang diharapkan, c4
juga diperbarui ketika c1
telah diperbarui.
Ini juga berlaku setiap kali c2
diperbarui.
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 1 | 0 | 2 | +------+------+------+------+------+
Dan tentu saja, itu juga akan berlaku ketika keduanya diperbarui.
Namun, itu tidak akan berlaku jika kami memperbarui c3
(tetapi bukan c1
atau c2
).
UPDATE t1
SET c3 = c3 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 1 | 1 | 2 | +------+------+------+------+------+
Mengharuskan Kedua Kolom Diperbarui
Kita dapat mengubah OR
ke AND
untuk menentukan bahwa c4
kolom hanya diperbarui jika keduanya c1
dan c2
sedang diperbarui.
Mari kita ubah pemicu kita untuk menentukan ini:
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;
Sekarang perbarui c1
saja.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 2 | 1 | 1 | 2 | +------+------+------+------+------+
Jadi c1
telah diperbarui seperti yang ditentukan, tetapi c4
tidak.
Hal yang sama akan terjadi jika kita memperbarui c2
tapi bukan c1
.
Tapi sekarang mari kita perbarui keduanya c1
dan c2
.
UPDATE t1
SET c1 = c1 + 1, c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 3 | 2 | 1 | 3 | +------+------+------+------+------+
Seperti yang diharapkan, kali ini c4
juga telah diperbarui.
Pembaruan Gagal
Penting untuk dicatat bahwa UPDATE()
fungsi hanya menunjukkan apakah INSERT
atau UPDATE
berusaha dibuat pada kolom tertentu dari tabel atau tampilan. Itu akan tetap mengembalikan true jika upaya tidak berhasil.
Fungsi COLUMNS_UPDATED
Cara lain untuk memeriksa pembaruan di beberapa kolom adalah dengan menggunakan COLUMNS_UPDATED
fungsi.
Fungsi ini mengembalikan varbinary pola bit yang menunjukkan kolom tabel atau tampilan yang disisipkan atau diperbarui.
Untuk informasi selengkapnya, lihat dokumentasi Microsoft untuk COLUMNS_UPDATED
.