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

Jalankan Pemicu Hanya Saat Kolom Tertentu Diperbarui (SQL Server)

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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menjelajahi Opsi Tunggu Kunci Prioritas Rendah di SQL Server 2014 CTP1

  2. DATEDIFF_BIG() Contoh di SQL Server

  3. Buat Pemicu "Alih-alih" di SQL Server

  4. SQL Server:Sisi gelap NVARCHAR

  5. Harus mendeklarasikan kesalahan variabel @myvariable dengan kueri berparameter ADO