Come disabilitare un trigger T-SQL programmaticamente
I trigger T-SQL di Microsoft SQL Server non sono disabilitabili programmaticamente a meno di ricorrere a un "trucchetto" usando la proprietà CONTEXT_INFO della sessione.
Il trucco è creare un trigger che controlla il valore contenuto nella CONTEXT_INFO e, se presente un valore predefinito, uscire senza fare niente.
La normale insert/update farà scattare il trigger:
per non far scattare il trigger invocarlo con:
Un esempio completo è questo:
che da come risultato
Il trucco è creare un trigger che controlla il valore contenuto nella CONTEXT_INFO e, se presente un valore predefinito, uscire senza fare niente.
SQL
CREATE TRIGGER [Trigger[SgartTestTrigger]
ON [TbSgartTestTrigger]
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ci VARBINARY(128);
SELECT @ci = Context_Info();
IF @ci= 0x1EAf111 -- valore costante scelto a caso. se settato tramite SET CONTEXT_INFO 0x1EAf111 non invoca il trigger
BEGIN
PRINT 'DISABILITATO';
RETURN;
END
PRINT 'ABILITATO';
--... inserire il codice del trigger ---
END
SQL
INSERT INTO [TbSgartTestTrigger] VALUES('a1');
SQL
-- imposto il contesto valido solo per questa sessione
SET CONTEXT_INFO 0x1EAf111
INSERT INTO [TbSgartTestTrigger] VALUES('a2');
-- resetto il contesto
SET CONTEXT_INFO 0x
SQL
-- creo la tabella di test
CREATE TABLE [TbSgartTestTrigger](
[code] nvarchar(50) NOT NULL
)
GO
-- aggancio il trigger
CREATE TRIGGER [Trigger[SgartTestTrigger]
ON [TbSgartTestTrigger]
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ci VARBINARY(128);
SELECT @ci = Context_Info();
IF @ci= 0x1EAf111 -- valore costante scelto a caso. se settato tramite SET CONTEXT_INFO 0x1EAf111 non invoca il trigger
BEGIN
PRINT 'DISABILITATO';
RETURN;
END
--... codice del trigger ---
PRINT 'ABILITATO';
END
GO
-- faccio la insert con "scatto" del trigger
PRINT 'Test trigger';
INSERT INTO [TbSgartTestTrigger] VALUES('a1');
GO
-- faccio la insert senza "scatto" del trigger
PRINT 'Test disabilitazione trigger';
SET CONTEXT_INFO 0x1EAf111
INSERT INTO [TbSgartTestTrigger] VALUES('a2');
SET CONTEXT_INFO 0x
GO
-- elimino la tabella
DROP TABLE [TbSgartTestTrigger]
GO
Text
Test trigger
ABILITATO
(1 row(s) affected)
Test disabilitazione trigger
DISABILITATO
(1 row(s) affected)