使用context_info傳遞上下文資訊禁用會話級觸發器

weixin_34292959發表於2019-01-12

如何在會話級別禁用觸發器是個問題,因為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


如果要在會話級禁用觸發器,只需要執行:

set context_info  0x00000001;
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;來檢視。

相關文章