2012-03-01 47 views
4

我想在某些情況下繞過觸發器,任何人都可以幫助我嗎?如何繞過SQL Server 2008上的觸發器

我試用了this link,但無法找到解決方案。

在此先感謝

+2

要做到這一點的唯一方法是暫時禁用觸發器。如果它出現在桌面上並且處於活動狀態,則無法繞過它。 – 2012-03-01 12:52:07

+0

ok msrv_s。但是如何暫時禁用觸發器。你可以給我一個例子或一些代碼。再次感謝。 – 2012-03-01 12:55:02

+1

(1)轉到MSDN,SQL Server聯機叢書,(2)搜索DISABLE TRIGGER - 您會在此處找到[此頁](http://msdn.microsoft.com/zh-cn/library/ms189748。 aspx)這給你**所有**你需要的細節.....禁用:禁用觸發器Person.uAddress ON Person.Address;'並重新啓用:'ENABLE TRIGGER Person.uAddress ON Person.Address ;' – 2012-03-01 13:07:57

回答

6

你不能避免運行觸發器。 你可以做的就是添加條件的,例如:

CREATE TRIGGER trigger_name 
    ON table 
    AFTER INSERT 
AS 
begin 
    IF (your condition) begin 
    --code 
    END 
end 

只是要小心,如果你有一個INSTEAD OF觸發器。如果您沒有編寫插入代碼,則表格中不會插入任何內容。

+0

感謝@diengo,但我有兩個表tableA和tableB我的觸發器無法處理多個記錄更新。所以現在,因爲我需要在tableA上更新大約100行,因此tableB上只有一條記錄被更新(我的意思是一次觸發是火災)。在這種情況下,我想繞過一個觸發器,我們將爲tableA和tableB更新編寫兩個更新語句。謝謝 – 2012-03-01 12:52:28

+0

嗨manish! 我不明白。你可以說得更詳細點嗎?可能會提供一些示例 – Diego 2012-03-01 13:00:33

+0

Table_A(ID,Name,Date) Table_B(BID,Name) 我們在Table_A上爲Update Table_B提供了寫入器更新觸發器。查看案例 更新表_A集名稱='OB'其中(1,2,3,4,5,6,7,... 100)中的ID 只有一次觸發器觸發。 – 2012-03-01 13:08:17

3

@Manish:我不認爲繞過觸發器是最佳實踐視角的好選擇。相反,我會評估,考慮並過濾觸發觸發器所需的一系列條件。

2

您可以通過檢查是否存在臨時表來抑制觸發器。需要抑制觸發器的代碼應創建一個臨時表(例如#suppress_trigger)。在你的觸發器中檢查這個臨時表的存在和返回。 示例:

CREATE TABLE [dbo].[dummy](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Val] [char](1) NULL) 

--create a history table which gets populated through trigger 
CREATE TABLE [dbo].[dummy_hist](
[Id] [int] NULL, 
[Val] [char](1) NULL) 

CREATE TRIGGER [dbo].[trig_Insert] 
    ON [dbo].[dummy]  
    AFTER INSERT 
AS 
BEGIN 

    SET NOCOUNT ON; 
    if OBJECT_ID('tempdb..#Dummy_escape_trig') is not NULL 
     RETURN 

    INSERT INTO dummy_hist 
    SELECT * FROM inserted 

END 

--Proc for which trigger needs to be suppressed 
CREATE PROCEDURE [dbo].[ins_dummy] 
     @val AS CHAR(1) 
AS 
BEGIN 

    SET NOCOUNT ON;  

    CREATE TABLE #Dummy_escape_trig (id int) 

INSERT INTO dummy 
    VALUES(@val) 
END