Innym podejściem jest skutecznie wyłączyć spust bez faktycznego wyłączenia go, wykorzystując dodatkową zmienną stanu, która jest uwzględniona w spuście.
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
Dla państwa zmienna można było przeczytać jakiś rodzaj blokady rekordu sterowania w tabeli (najlepiej, jeśli ogranicza się do kontekście bieżącej sesji), użyj CONTEXT_INFO(), lub skorzystać z obecności konkretnej tabeli temp nazwa (która jest już ograniczony zakres sesji):
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
Następnie wyłączyć wszystkie wyzwalacze:
select 1 as A into #Common_DisableTableTriggers;
-- do work
drop table #Common_DisableTableTriggers; -- or close connection
potencjalnie poważnym minusem jest to, że wyzwalacz jest trwale slowe d w zależności od złożoności dostępu do zmiennej stanu.
Edytuj: Dodawanie odniesienia do tego niezwykle podobnego 2008 post by Samuel Vanga.
Dzięki! Myślę, że moja naiwność SQL Server 2005 jest zbyt dobra na tej stronie. –
Bez obaw; być DBA przez długi czas i te rzeczy stają się automatyczne :) –
tj. jeśli używasz opcji modyfikacji wyzwalacza, a skrypt zawiera 'ALTER TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWszystko]' then you need 'WYŁĄCZ TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWszystko] 'i' ENABLE TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWszystko] ' –