Per risolvere il tuo problema, dobbiamo adottare un approccio programmatico al problema. Ci sono due percorsi che puoi seguire qui. Il motivo per cui sono necessari questi approcci è perché non è possibile disabilitare un trigger per una particolare istruzione, può essere disabilitato solo per l'intera tabella.
Opzione 1: Context_Info ()
Samuel Vanga su MS SQL Tips ha avuto un ottimo esempio:
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
Ora, quando Samuel non vuole eseguire il trigger, usano questo:
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
utilizza le seguenti visualizzazioni di sistema per acquisire informazioni sulla sessione corrente:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
L'ideologia qui è che la stringa binaria che stai impostando è esposta solo alla sessione corrente, quindi quando il trigger viene eseguito durante la sessione, vedrà l'ambito e l'impostazione variabile della Context_info
funzione e salterà alla porzione di escape del trigger anziché.
Opzione 2: tabella temporanea
Itzik Ben-Gan ha una grande soluzione nel suo libro "Inside Microsoft SQL Server 2008 Programmazione T-SQL: programmazione T-SQL", che è anche nel suo libro T-SQL Querying . Il problema principale con questo oltre la context_info
funzione è il sovraccarico TempDB minore.
Per rovinare la sorpresa ma non rovinare la trama dei libri (ho sentito che vale la pena acquistare e leggere), altererai il tuo grilletto.
Il trigger dovrebbe eseguire un controllo per una tabella temporanea. Se esiste una tabella temporanea, il trigger dovrebbe sapere di terminare e non eseguire le azioni.
Nell'istruzione di aggiornamento che si desidera eseguire, creare prima la tabella temporanea. Verrà visualizzato nella stessa transazione del trigger e causerà al trigger di ignorare la tua dichiarazione.
Esempio di trigger:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
Esempio di istruzione iniziale quando non si desidera eseguire il trigger:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
Mettendo tutto insieme per il tuo esempio:
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