2013-09-24 152 views
3

我有一個更新觸發器,用於更新表tblCurrent中的一些重要狀態字段。
當我第一次上傳每日批量記錄到tblCurrent(大約10K條記錄)時,我會通過三個單獨的存儲過程在第一次上傳時執行一些更新,然後纔會上傳。 如何防止在這三個初始更新期間運行更新觸發器?如何更新SQL Server表而不觸發UPDATE觸發器

+0

的[有沒有一種方法來禁用一個SQL Server觸發器執行的只是一個特定的範圍是什麼?]可能重複(HTTP:/ /stackoverflow.com/questions/174600/is-there-a-way-to-disable-a-sql-server-trigger-for-just-a-particular-scope-of-ex) –

+0

一個令人討厭的黑客將創建另一個表分組到您的其他表。這個新表有1列,稱爲鎖定。這是真的還是假的。在存儲過程之前,將其設置爲false。將其設置爲true後。當然,這意味着你的所有查詢都必須手動檢查條件,但這是我們如何做的。這是一個醜陋的黑客攻擊,容易出現人爲錯誤,但它確實有效。 – Dave

回答

3

您可以暫時禁用表格的觸發器,然後啓用它們。 MSDN article

DISABLE TRIGGER {[schema_name。 ] trigger_name [,... n] | ALL} ON {object_name | DATABASE | ALL SERVER} [; ]

ENABLE TRIGGER {[schema_name。 ] trigger_name [,... n] | ALL} ON {object_name | DATABASE | ALL SERVER} [; ]

例如禁用對給定的表運行的所有觸發器以下語句:

DISABLE TRIGGER ALL ON tblCurrent; 
+3

但這會影響其他併發連接。不是一個好主意。以下文章有一些替代方法:http://www.mssqltips.com/sqlservertip/1591/disabling-a-trigger-for-a-specific-sql-statement-or-session/ – Joe

+0

這是完美的。在tblCurrent的新批記錄後一天運行一次的三個「存儲過程」通常會在觸發器啓用後總共花費20分鐘時間。現在需要五分鐘時間。謝謝。 – aSystemOverload

3

做到這一點的一種方法是在tblCurrent中有一些數據,使您能夠檢測到您描述爲「首次上傳」的情況。例如,BIT列「FirstUploaded」,或首次上傳時爲NULL的列,甚至是BIT列「DontFireTrigger」。

然後編寫觸發器來檢測這種情況,並有條件地更新狀態字段。

無可否認,這看起來像一個討厭的黑客,但也許並不比其他解決方案更糟。

0

你可以使用會話變量CONTEXT_INFO。之前CONTEXT_INFO設置爲某個值,然後更新測試觸發內部

-- update code SET Context_Info 0x55555 Update Table set ...

-- Code Inside the trigger SELECT @Cinfo = Context_Info() IF @Cinfo <> 0x55555 BEGIN ... END