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

Apakah mungkin untuk mengidentifikasi secara pasti apakah perintah DML dikeluarkan dari prosedur tersimpan?

Gunakan CONTEXT_INFO (Transact-SQL) . Dalam prosedur, tetapkan nilai untuk memperingatkan pemicu agar tidak merekam apa pun:

--in the procedure doing the insert/update/delete

DECLARE @CONTEXT_INFO  varbinary(128)
SET @CONTEXT_INFO =cast('SkipTrigger=Y'+REPLICATE(' ',128) as varbinary(128))
SET CONTEXT_INFO @CONTEXT_INFO

--do insert/update/delete that will fire the trigger

SET CONTEXT_INFO 0x0 

Di pemicu, periksa CONTEXT_INFO dan tentukan apakah Anda perlu melakukan sesuatu:

--here is the portion of the trigger to retrieve the value:

IF CAST(CONTEXT_INFO() AS VARCHAR(128))='SkipTrigger=Y'
BEGIN
    --log your data here
END

bagi siapa pun yang hanya melakukan penyisipan/pembaruan/penghapusan nakal, mereka tidak akan mengatur CONTEXT_INFO dan pemicu akan merekam perubahan. Anda bisa menyukai nilai yang Anda masukkan ke CONTEXT_INFO, seperti nama tabel atau @@SPID, dll. jika menurut Anda kode jahat akan mencoba menggunakan CONTEXT_INFO juga.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara saya menulis .Skip(1000).Take(100) LINQ dalam SQL murni?

  2. Hasilkan nomor acak yang tidak ada di tabel di server sql

  3. Bagaimana cara memvalidasi poligon geografi di SQL server 2008?

  4. Fungsi String T-SQL:perbedaan antara menggunakan Kiri/Kanan dan Substring dan perilaku aneh

  5. Optimalisasi kueri SQL — Cara menentukan kapan dan jika diperlukan