Para resolver su problema, debemos adoptar un enfoque programático del problema. Hay dos rutas que puedes seguir aquí. La razón por la que necesita estos enfoques es porque no puede deshabilitar un desencadenador para una declaración particular, solo puede deshabilitarse para la totalidad de la tabla.
Opción 1: Context_Info ()
Samuel Vanga en MS SQL Tips tuvo un gran ejemplo:
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
Ahora, cuando Samuel no quiere que se ejecute el disparador, usan esto:
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
utiliza las siguientes vistas del sistema para obtener información sobre la sesión actual:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
La ideología aquí es que la cadena binaria que está configurando está expuesta solo a la sesión actual, por lo que cuando el disparador se ejecute durante su sesión, verá el alcance y la configuración variable de la Context_info
función y saltará a la parte de escape del disparador en lugar.
Opción 2: tabla temporal
Itzik Ben-Gan tiene una gran solución en su libro "Inside Microsoft SQL Server 2008 Programación T-SQL: Programación T-SQL", que también se encuentra en su libro posterior T-SQL Querying . El principal problema con esto sobre la context_info
función es la sobrecarga menor de TempDB.
Para estropear la sorpresa pero no arruinar la trama de los libros (sentí que vale la pena comprarlos y leerlos), alterará su gatillo.
Su disparador debe realizar una verificación para una tabla temporal. Si la tabla temporal existe, el desencadenador debe saber que finaliza y no realiza las acciones.
En la declaración de actualización que desea realizar, cree primero la tabla temporal. Se verá en la misma transacción que el activador y hará que el activador ignore su estado de cuenta.
Ejemplo de disparador:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
Ejemplo de declaración inicial cuando no desea que se ejecute el desencadenador:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
Poniéndolo por completo para su ejemplo:
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