Pemicu menembak meskipun tidak ada baris yang terpengaruh

10

Ini lebih merupakan pertanyaan umum tetapi motivasi untuk pertanyaan ini adalah masalah yang saya hadapi saat menggunakan SQL Server.

Saya memiliki pemicu ini dilampirkan ke acara Sisipkan pada tabel yang berisi beberapa logika yang, sebagai efek samping, akan meningkatkan kesalahan jika tidak ada baris yang dimasukkan. Setelah diselidiki lebih lanjut, saya menemukan bahwa pelatuknya menyala meskipun tidak ada baris yang dimasukkan.

Bahasa yang digunakan dalam Microsoft Documents pada DML Pemicu tampaknya bertentangan dengan perilaku ini:

Pemicu DML adalah jenis khusus prosedur tersimpan yang secara otomatis berlaku ketika peristiwa DML terjadi yang memengaruhi tabel atau tampilan yang ditentukan dalam pemicu.

Apakah ini perilaku default di seluruh DBMS? Apakah ada alasan khusus untuk memicu pemicu ketika tidak ada baris yang terpengaruh?

Luís Gabriel de Andrade
sumber

Jawaban:

24

Untuk tindakan DML, ada pemicu berbasis baris dan pemicu berbasis pernyataan.

  • Baris memicu kebakaran ketika (sebelum, sesudah atau alih-alih) setiap baris terpengaruh (dimasukkan / diperbarui / dihapus). Jadi mereka akan menembak 100 kali jika 100 baris terpengaruh dan tidak sama sekali jika 0 baris terpengaruh.

  • Pernyataan memicu api ketika sebuah INSERT / UPDATE / DELETEpernyataan dieksekusi. Tidak masalah jika tidak ada baris yang terpengaruh. Level pernyataan memicu api dan hanya sekali untuk pernyataan (apakah itu 0, 100 atau satu miliar baris yang terpengaruh).

Beberapa DBMS hanya memiliki pemicu level baris (MySQL).

Lainnya (seperti SQL Server * yang merupakan DBMS Anda) hanya memiliki pemicu tingkat pernyataan.

Beberapa lainnya (DB2, Oracle, Postgres) memiliki kedua jenis pemicu.


* Status SQL Server CREATE TRIGGERdocs :

Pemicu DML dijalankan ketika pengguna mencoba mengubah data melalui peristiwa bahasa manipulasi data (DML). Peristiwa DML adalah INSERT,, UPDATEatau DELETEpernyataan di atas tabel atau tampilan. Ini memicu kebakaran ketika peristiwa yang valid dipecat, terlepas dari apakah baris tabel terpengaruh atau tidak.

ypercubeᵀᴹ
sumber