Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Buat Pemicu "Alih-alih" di SQL Server

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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbedaan antara CTE dan SubQuery?

  2. Melewati varchar yang penuh dengan nilai yang dibatasi koma ke fungsi SQL Server IN

  3. Tambahkan Akun Email Database ke Profil (T-SQL)

  4. Kueri membandingkan tanggal dalam SQL

  5. Membuat Kasus untuk Layanan SQL Server Reguler