Saat Anda membuat pemicu di SQL Server, Anda memiliki opsi untuk mengaktifkannya bersama dengan pernyataan pemicu (yaitu pernyataan SQL yang memicu pemicu), atau mengaktifkannya sebagai gantinya dari pernyataan itu.
Untuk menyalakan pemicu sebagai gantinya dari pernyataan pemicu, gunakan INSTEAD OF
argumen.
Ini berbeda dengan menggunakan FOR
atau AFTER
argumen. Saat Anda menggunakan argumen tersebut, pemicu akan diaktifkan hanya jika semua operasi yang ditentukan dalam pernyataan SQL pemicu telah berhasil diluncurkan.
Contoh
Buat tabel contoh:
CREATE TABLE t1 (
id int IDENTITY(1,1) NOT NULL,
c1 int DEFAULT 0,
c2 int DEFAULT 0,
c3 int DEFAULT 0
);
Buat pemicunya:
CREATE TRIGGER trg_t1
ON t1
INSTEAD OF UPDATE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);
Sisipkan baris contoh:
INSERT INTO t1 (c1, c2, c3)
VALUES (1, 1, 1);
SELECT * FROM t1;
Inilah yang kami miliki sejauh ini:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 1 | +------+------+------+------+
Sekarang mari kita jalankan UPDATE
pernyataan terhadap tabel (ini akan memicu pemicu).
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 2 | +------+------+------+------+
Seperti yang diharapkan, UPDATE
pernyataan dalam pernyataan pemicu diganti dengan yang ada di pemicu.
Pemicu saya menetapkan bahwa setiap kali ada upaya pembaruan ke tabel, perbarui c3
kolom sebagai gantinya.
Jalankan Hanya Saat Kolom Tertentu Diperbarui
Anda juga dapat menggunakan UPDATE()
berfungsi untuk menentukan kode yang akan dijalankan hanya ketika kolom tertentu diperbarui.
Misalnya, kita dapat mengubah pemicu kita sebagai berikut:
ALTER TRIGGER trg_t1
ON t1
INSTEAD OF UPDATE
AS
IF ( UPDATE(c1) )
BEGIN
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;
Sekarang jalankan UPDATE
sebelumnya pernyataan lagi:
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 3 | +------+------+------+------+
Sekali lagi, c3
kolom bertambah.
Tapi, sekarang mari kita coba perbarui c2
kolom:
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 3 | +------+------+------+------+
Tidak ada yang berubah. c3
kolom tetap sama.
Bahkan bukan c2
kolom diperbarui. Ini karena, pemicu masih berjalan alih-alih pernyataan pemicu.
Jalankan Pemicu Alih-alih DELETE
Kami dapat memodifikasi pemicu untuk dijalankan sebagai ganti DELETE
pernyataan.
ALTER TRIGGER trg_t1
ON t1
INSTEAD OF DELETE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM deleted);
Sekarang mari kita coba untuk menghapus semua baris dan kemudian memilih semua baris dari tabel.
DELETE FROM t1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 4 | +------+------+------+------+
Perhatikan bahwa agar pemicu ini berfungsi dengan baik, saya harus menanyakan deleted
tabel di pemicu saya (sebagai lawan dari inserted
tabel pada contoh sebelumnya).
Kedua tabel ini dibuat dan dikelola oleh SQL Server.
deleted
tabel menyimpan salinan dari baris yang terpengaruh selama DELETE
dan UPDATE
pernyataan. Selama eksekusi DELETE
atau UPDATE
pernyataan, baris dihapus dari tabel pemicu dan ditransfer ke tabel yang dihapus.
inserted
tabel menyimpan salinan baris yang terpengaruh selama INSERT
dan UPDATE
pernyataan. Selama transaksi penyisipan atau pembaruan, baris baru ditambahkan ke tabel yang disisipkan dan tabel pemicu. Baris dalam tabel yang disisipkan adalah salinan dari baris baru di tabel pemicu.
Beberapa Batasan yang Perlu Diingat
Anda dapat menentukan maksimal satu INSTEAD OF
pemicu per INSERT
, UPDATE
, atau DELETE
pernyataan di atas meja atau tampilan.
Anda tidak dapat menentukan INSTEAD OF
memicu pada tampilan yang dapat diperbarui yang menggunakan WITH CHECK OPTION
.