如何在會話級別禁用觸發器是個問題,因為sql server並沒有提供一個管理手段可以在會話級禁用觸發器,它只提供
alter table 表名 disable trigger 觸發器名 類似這種,而這種方法一旦執行,那如果在同一時間的其他過程,也不會執行觸發器。但是我們可以巧妙繞道使用 context_info 來讓觸發器支援會話級別的禁用。
新建觸發器
alter TRIGGER testtrigger
ON t1
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
if(context_info() = 0x00000001)
begin
print 'ok';
end
END
GO
ON t1
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
if(context_info() = 0x00000001)
begin
print 'ok';
end
END
GO
如果要在會話級禁用觸發器,只需要執行:
set context_info 0x00000001;
insert into t1
values (1,'1');
insert into t1
values (1,'1');
這樣就能根據上下文來執行觸發器的具體過程了。
在UDF裡面也是一樣的,甚至在同一會話儲存過程巢狀呼叫,都可以根據上下文來執行。
不過記住context_info 是一個varbinary(128)的變數,在動態檢視sys.dm_exec_sessions的context_info欄位裡面有體現。可以使用 select context_info from sys.dm_exec_sessions where session_id = @@spid;來檢視。