Para resolver seu problema, precisamos adotar uma abordagem programática. Existem duas rotas que você pode ir aqui. O motivo para a necessidade dessas abordagens é porque você não pode desativar um gatilho para uma instrução específica, ela pode ser desativada apenas para a totalidade da tabela.
Opção 1: Context_Info ()
Samuel Vanga no MS SQL Tips teve um ótimo exemplo:
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
Agora, quando Samuel não quer que o gatilho seja executado, eles usam isso:
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
usa as seguintes visualizações do sistema para obter informações sobre a sessão atual:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
A ideologia aqui é que a string binária que você está configurando é exposta apenas à sessão atual; portanto, quando o gatilho for executado durante a sessão, ele verá o escopo e a configuração variável da Context_info
função e pulará para a parte de escape do gatilho. em vez de.
Opção 2: tabela temporária
Itzik Ben-Gan tem uma ótima solução em seu livro "Por dentro da programação T-SQL do Microsoft SQL Server 2008: programação T-SQL", que também está em seu livro posterior Consulta T-SQL . O principal problema com isso na context_info
função é a sobrecarga secundária do TempDB.
Para estragar a surpresa, mas não estragar a trama dos livros (achei que valem a pena comprar e ler), você alterará seu gatilho.
Seu gatilho deve verificar se há uma tabela temporária. Se a tabela temporária existir, o gatilho deve saber finalizar e não executar as ações.
Na instrução de atualização que você deseja executar, crie a tabela temporária primeiro. Ele será visto na mesma transação que o gatilho e fará com que o gatilho ignore sua declaração.
Exemplo de gatilho:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
Exemplo de instrução inicial quando você não deseja que o gatilho seja executado:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
Colocando tudo no seu exemplo:
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