cách tiếp cận khác là hiệu quả vô hiệu hóa cò mà không thực sự tắt nó, sử dụng một biến trạng thái bổ sung mà được đưa vào cò.
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
Đối với tình trạng biến người ta có thể đọc một số loại hồ sơ kiểm soát khóa trong một bảng (tốt nhất nếu giới hạn ở những bối cảnh của phiên hiện tại), sử dụng context_info(), hoặc sử dụng sự hiện diện của một bảng tạm thời đặc biệt tên (mà đã là phiên phạm vi hạn chế):
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
Sau đó, để vô hiệu hóa tất cả các trigger:
select 1 as A into #Common_DisableTableTriggers;
-- do work
drop table #Common_DisableTableTriggers; -- or close connection
Một nhược điểm có khả năng lớn là cò là vĩnh viễn slowe d xuống tùy thuộc vào độ phức tạp của việc truy cập biến trạng thái.
Chỉnh sửa: Thêm tham chiếu đến điều này đáng ngạc nhiên tương tự 2008 post by Samuel Vanga.
Cảm ơn! Tôi nghĩ rằng SQL Server 2005 ngụy trang của tôi đang hiển thị quá tốt trên trang web này. –
Không phải lo lắng; là một DBA trong một thời gian dài và những thứ này trở thành tự động :) –
tức là nếu bạn sử dụng tùy chọn để sửa đổi trình kích hoạt và tập lệnh chứa 'ALTER TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' thì bạn cần 'DISABLE TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' và 'ENABLE TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' –