我有一個更新觸發器,用於更新表tblCurrent
中的一些重要狀態字段。
當我第一次上傳每日批量記錄到tblCurrent
(大約10K條記錄)時,我會通過三個單獨的存儲過程在第一次上傳時執行一些更新,然後纔會上傳。 如何防止在這三個初始更新期間運行更新觸發器?如何更新SQL Server表而不觸發UPDATE觸發器
回答
您可以暫時禁用表格的觸發器,然後啓用它們。 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;
但這會影響其他併發連接。不是一個好主意。以下文章有一些替代方法:http://www.mssqltips.com/sqlservertip/1591/disabling-a-trigger-for-a-specific-sql-statement-or-session/ – Joe
這是完美的。在tblCurrent的新批記錄後一天運行一次的三個「存儲過程」通常會在觸發器啓用後總共花費20分鐘時間。現在需要五分鐘時間。謝謝。 – aSystemOverload
做到這一點的一種方法是在tblCurrent
中有一些數據,使您能夠檢測到您描述爲「首次上傳」的情況。例如,BIT列「FirstUploaded」,或首次上傳時爲NULL的列,甚至是BIT列「DontFireTrigger」。
然後編寫觸發器來檢測這種情況,並有條件地更新狀態字段。
無可否認,這看起來像一個討厭的黑客,但也許並不比其他解決方案更糟。
你可以使用會話變量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
- 1. SQL Server觸發器更新
- 2. 更新觸發器SQL Server
- 3. SQL Server觸發器基於表觸發器更新其他表
- 4. SQL Server:觸發器觸發
- 5. Postgres - 'after update'觸發器不會觸發
- 6. 的SQL Server觸發更新
- 7. MySQL觸發UPDATE不觸發
- 8. Oracle觸發器UPDATE而不是INSERT
- 9. SQL Server觸發器更新列值
- 10. 在sql server中更新觸發器
- 11. SQL Server 2008更新觸發器
- 12. SQL Server 2014:更新FileTable觸發器File_Stream.PathName()
- 13. 更新觸發器在SQL Server 2008
- 14. SQL Server觸發器和批量更新
- 15. SQL Server更新後觸發器
- 16. SQL Server INSERT在後更新觸發器
- 17. SQL Server觸發器 - 複製行更新
- 18. 更新觸發器SQL Server 2008
- 19. 如何動態更新所有字段而不是更新觸發器SQL Server
- 20. FoxPro和SQL Server而不是觸發器
- 21. SQL觸發器不工作/更新表
- 22. Mysql觸發器做INSERT而不是UPDATE
- 23. AFTER UPDATE觸發器
- 24. SQL Server觸發器
- 25. Sql Server觸發器
- 26. Sql Server觸發器
- 27. SQL Server觸發器
- 28. 確定更新觸發器是否由ON UPDATE CASCADE觸發
- 29. SQL Server 2005 - 觸發器沒有觸發
- 30. 創建INSERT觸發器更新CreatedBy和UpdatedBy而不觸發相同表上的更新觸發器
的[有沒有一種方法來禁用一個SQL Server觸發器執行的只是一個特定的範圍是什麼?]可能重複(HTTP:/ /stackoverflow.com/questions/174600/is-there-a-way-to-disable-a-sql-server-trigger-for-just-a-particular-scope-of-ex) –
一個令人討厭的黑客將創建另一個表分組到您的其他表。這個新表有1列,稱爲鎖定。這是真的還是假的。在存儲過程之前,將其設置爲false。將其設置爲true後。當然,這意味着你的所有查詢都必須手動檢查條件,但這是我們如何做的。這是一個醜陋的黑客攻擊,容易出現人爲錯誤,但它確實有效。 – Dave