Di SQL Server, Anda dapat menggunakan CREATE TRIGGER
pernyataan untuk membuat pemicu.
Pemicu adalah jenis khusus dari prosedur tersimpan yang secara otomatis berjalan ketika suatu peristiwa terjadi di server database.
Anda dapat membuat pemicu DML, pemicu DDL, atau pemicu masuk.
Artikel ini memberikan contoh pembuatan pemicu DML.
Apa itu Pemicu DML?
Pemicu DML adalah pemicu yang berjalan saat pengguna mencoba mengubah data melalui peristiwa bahasa manipulasi data (DML).
Acara DML termasuk INSERT
, UPDATE
, atau DELETE
pernyataan. Pemicu DML dapat digunakan untuk menegakkan aturan bisnis dan integritas data, membuat kueri tabel lain, dan menyertakan pernyataan T-SQL yang kompleks.
Pemicu dan pernyataan yang mengaktifkannya diperlakukan sebagai satu transaksi, yang dapat dibatalkan dari dalam pemicu.
Contoh
Berikut adalah contoh untuk mendemonstrasikan cara kerja pemicu DML.
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
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);
Dalam contoh ini saya membuat tabel dan saya juga membuat pemicu yang akan diaktifkan setiap kali baris dimasukkan atau diperbarui dalam tabel itu.
Dalam hal ini, pemicu menambahkan 1 ke c3
kolom setiap kali data dimasukkan atau diperbarui.
Saya memanggil pemicu trg_t1
. Saya mengikuti bagian itu dengan ON t1
, yang berarti pemicu akan dijalankan pada tabel bernama t1
.
Sebagai alternatif, Anda dapat menentukan tampilan untuk menjalankan pemicu, meskipun Anda hanya dapat mereferensikan tampilan dengan INSTEAD OF
pemicu (dalam hal ini, ganti AFTER
dengan INSTEAD OF
). Selain itu, Anda tidak dapat menentukan pemicu DML pada tabel sementara lokal atau global.
AFTER
menetapkan bahwa pemicu DML diaktifkan hanya ketika semua operasi yang ditentukan dalam pernyataan SQL pemicu telah berhasil diluncurkan. Sebagai alternatif, Anda dapat menentukan FOR
di sini.
Alternatif lain adalah menggunakan INSTEAD OF
, yang akan menjalankan pemicu sebagai gantinya dari pernyataan SQL yang memicu. Oleh karena itu, ini mengesampingkan tindakan dari pernyataan pemicu.
Apa yang inserted
Tabel?
Di pemicu saya, saya dapat mengetahui baris mana yang diperbarui dengan menanyakan inserted
tabel.
SQL Server membuat dan mengelola tabel yang disebut inserted
, yang merupakan tabel residen memori sementara yang menyimpan salinan baris yang terpengaruh selama INSERT
dan UPDATE
pernyataan. Selama transaksi penyisipan atau pembaruan, baris baru ditambahkan ke inserted
meja dan meja pemicu. Baris dalam tabel yang disisipkan adalah salinan dari baris baru di tabel pemicu.
SQL Server juga membuat dan memelihara tabel serupa yang disebut terhapus, yang 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.
Jalankan Pemicunya
Sekarang tabel dan pemicunya telah dibuat, mari jalankan beberapa pernyataan SQL yang akan memicunya.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Hasil:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
Jadi kita bisa melihat bahwa pemicunya bekerja seperti yang diharapkan. Saat saya menyisipkan baris, saya hanya menetapkan nilai untuk c1
kolom, tetapi pemicu memastikan bahwa c3
kolom juga diperbarui.
Perhatikan bahwa nilai default untuk semua kolom adalah 0
(seperti yang ditentukan saat saya membuat tabel), dan pemicu menambahkan 1 ke dalamnya.
Ayo lakukan UPDATE
operasi pada kolom yang sama.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
Sekali lagi, c3
kolom juga diperbarui oleh pemicu.
Sekarang mari kita perbarui c2
kolom.
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Hasil:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
Jadi sekali lagi, c3
kolom diperbarui oleh pemicu.
Pemicu khusus ini diaktifkan setiap kali kolom lain di baris yang sama diperbarui.
Anda juga dapat menggunakan IF UPDATE(column_name)
untuk memeriksa pembaruan ke satu kolom, atau COLUMNS_UPDATED()
untuk memeriksa pembaruan di beberapa kolom.