Otro enfoque es efectivamente desactivar el gatillo sin llegar a su desactivación, utilizando una variable de estado adicional que se incorpora en el gatillo.
create trigger [SomeSchema].[SomeTableIsEditableTrigger] ON [SomeSchema].[SomeTable]
for insert, update, delete
as
declare
@isTableTriggerEnabled bit;
exec usp_IsTableTriggerEnabled -- Have to use USP instead of UFN for access to #temp
@pTriggerProcedureIdOpt = @@procid,
@poIsTableTriggerEnabled = @isTableTriggerEnabled out;
if (@isTableTriggerEnabled = 0)
return;
-- Rest of existing trigger
go
Para el estado de una variable podía leer algún tipo de registro de control de bloqueo en una tabla (mejor si se limita al contexto de la sesión actual), utilice CONTEXT_INFO() o utilice la presencia de una tabla temporal en particular nombre (que ya está limitada al ámbito de sesión):
create proc [usp_IsTableTriggerEnabled]
@pTriggerProcedureIdOpt bigint = null, -- Either provide this
@pTableNameOpt varchar(300) = null, -- or this
@poIsTableTriggerEnabled bit = null out
begin
set @poIsTableTriggerEnabled = 1; -- default return value (ensure not null)
-- Allow a particular session to disable all triggers (since local
-- temp tables are session scope limited).
--
if (object_id('tempdb..#Common_DisableTableTriggers') is not null)
begin
set @poIsTableTriggerEnabled = 0;
return;
end
-- Resolve table name if given trigger procedure id instead of table name.
-- Google: "How to get the table name in the trigger definition"
--
set @pTableNameOpt = coalesce(
@pTableNameOpt,
(select object_schema_name(parent_id) + '.' + object_name(parent_id) as tablename
from sys.triggers
where object_id = @pTriggerProcedureIdOpt)
);
-- Else decide based on logic involving @pTableNameOpt and possibly current session
end
continuación para desactivar todos los disparadores:
select 1 as A into #Common_DisableTableTriggers;
-- do work
drop table #Common_DisableTableTriggers; -- or close connection
Una desventaja potencialmente importante es que el gatillo está permanentemente slowe d abajo dependiendo de la complejidad del acceso de la variable de estado.
Editar: Agregando una referencia a este 2008 post by Samuel Vanga sorprendentemente similar.
Gracias! Creo que mi ingenio de SQL Server 2005 se muestra muy bien en este sitio. –
Sin preocupaciones; ser un DBA durante mucho tiempo y estas cosas se vuelven automáticas :) –
es decir, si usa la opción para modificar un disparador y el script contiene 'ALTER TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' entonces usted necesita 'DISABLE TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' y 'ENABLE TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' –