Untuk mengatasi masalah Anda, kami harus mengambil pendekatan terprogram untuk masalah tersebut. Ada dua rute yang bisa Anda tuju di sini. Alasan untuk memerlukan pendekatan ini adalah karena Anda tidak dapat menonaktifkan pemicu untuk pernyataan tertentu, itu hanya dapat dinonaktifkan untuk keseluruhan tabel.
Opsi 1: Context_Info ()
Samuel Vanga di MS SQL Tips memiliki contoh yang bagus:
USE AdventureWorks;
GO
-- creating the table in AdventureWorks database
IF OBJECT_ID('dbo.Table1') IS NOT NULL
DROP TABLE dbo.Table1
GO
CREATE TABLE dbo.Table1(ID INT)
GO
-- Creating a trigger
CREATE TRIGGER TR_Test ON dbo.Table1 FOR INSERT,UPDATE,DELETE
AS
DECLARE @Cinfo VARBINARY(128)
SELECT @Cinfo = Context_Info()
IF @Cinfo = 0x55555
RETURN
PRINT 'Trigger Executed'
-- Actual code goes here
-- For simplicity, I did not include any code
GO
Sekarang ketika Samuel tidak ingin ingin pelatuk dieksekusi, mereka menggunakan ini:
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
menggunakan tampilan sistem berikut untuk mengambil informasi mengenai sesi saat ini:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
Ideologinya di sini adalah bahwa string biner yang Anda setel hanya terpapar ke sesi saat ini, jadi ketika pelatuk dijalankan selama sesi Anda, ia akan melihat ruang lingkup dan pengaturan variabel Context_info
fungsi dan itu akan melompat ke bagian melarikan diri dari pelatuk sebagai gantinya.
Opsi 2: Tabel Temp
Itzik Ben-Gan memiliki solusi hebat dalam bukunya "Di dalam Microsoft SQL Server 2008 Pemrograman T-SQL: Pemrograman T-SQL" yang juga ada dalam bukunya T-SQL Querying . Masalah utama dengan context_info
fungsi ini adalah overhead TempDB kecil.
Untuk merusak kejutan tetapi tidak merusak plot buku-buku (saya merasa mereka layak dibeli dan dibaca), Anda akan mengubah pelatuk Anda.
Pemicu Anda harus melakukan pemeriksaan untuk tabel sementara. Jika tabel sementara ada, pelatuk harus tahu untuk mengakhiri dan tidak melakukan tindakan.
Dalam pernyataan pembaruan yang ingin Anda lakukan, buat tabel sementara terlebih dahulu. Itu akan terlihat dalam transaksi yang sama sebagai pemicu dan itu akan menyebabkan pemicu mengabaikan pernyataan Anda.
Contoh pemicu:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
Contoh pernyataan awal saat Anda tidak ingin pemicu dijalankan:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
Taruh semuanya sebagai contoh Anda:
ALTER TRIGGER tiu_benefit ON benefit FOR
...
AS
...
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
--... rest of code here
GO
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
UPDATE benefit SET editor = 'srh' where benefit_id = 9876;
GO