程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 在一個特定的SQL語句或會話中停用觸發器

在一個特定的SQL語句或會話中停用觸發器

編輯:關於SqlServer

問題

我有一個創建在表上的觸發器,當對表執行一個INSERT,DELETE或者UPDATE語句時,這個觸發器將被激活執行。我想在一個特定的語句上阻止觸發器被激活,而當執行其它語句時觸發器仍然保持正常的執行狀態。有沒有一種方法可以動態做到這些?

專家解答

在某些時候,停用觸發器是可能需要你去做的事情,尤其是你在一張表上執行管理員任務時。實現這點的最好方法是使用以下的命令去完全停用觸發器。

ALTER TABLE Table_Name DISABLE TRIGGER Trigger_Name

盡管如此,如果你只想在一個特殊的語句上停用觸發器,然而沒有一種默認的機制來實現這一點,除非你開發一種自己的可編程的方法。使用這種方法只在某個特定語句上停用觸發器而這個觸發器在其他同時點擊服務器的語句上繼續被激活執行。

即使有很多種方式去實現它,主要的邏輯在於傳遞一些信號給觸發器,告訴觸發器你不需要激活它執行。

使用一張臨時表

實現這個任務最簡單的方法是在你執行會激活觸發器的語句之前先創建一張臨時表。現在這個觸發器將檢查臨時表存在與否,並且,如果這張臨時表存在,那麼觸發器將會返回並且不執行代碼,否則它將會像平常一樣執行它的代碼。

為了看看執行過程,讓我們來運行以下的語句來創建一張表和一個觸發器。

USE AdventureWorks;
GO
-- creating the table in AdventureWorks database
IF OBJECT_ID('dbo.Table1') IS NOT NULL
DROP TABLE dbo.Table1
GO
CREATE TABLE dbo.Table1(ID INT)
GO
-- Creating a trigger
CREATE TRIGGER TR_Test ON dbo.Table1 FOR INSERT,UPDATE,DELETE
AS
IF OBJECT_ID('tempdb..#Disable') IS NOT NULL RETURN
PRINT 'Trigger Executed'
-- Actual code goes here
-- For simplicity, I did not include any code
GO

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved