Sql-Server

如何防止觸發器在某些語句上執行?

  • June 8, 2015

我正在尋找滿足我對 SQL Server 和 MySQL 的需求的答案。

我有一個小的自定義審計表,我將通過各種表上的觸發器寫入該表。在某些情況下,我想繞過這些觸發器。我知道我可以在表格上創建一列並將其用作觸發器的一種標誌,但我希望能找到一些能減少混亂的東西。

是否可以防止在我的語句或其他查詢方面使用變數來呼叫觸發器?

編輯:澄清一下,我不期望在兩個平台上都有效的實際觸發器/查詢。我正在尋找一種滿足不需要在每個表中使用額外列的預期目標的解決方案。

我又回答了這樣一個問題Jan 20, 2012Disable trigger for only one table

這是我建議的 MySQL 的一種解決方法。到目前為止沒有負面回饋。

對於 SQL Server,我們使用了多年而沒有任何問題的快速而骯髒的方法是使用具有特定名稱(通常基於觸發器名稱)的臨時表的存在,以便提供簡單的手冊繞過觸發器的覆蓋。#temp 表將特定於此連接,但仍保留在觸發器的範圍內,因此可用作傳遞資訊的一種方式。如果您正在處理一個非常高並發的 OLTP 類型的環境,您將需要在繼續生產之前測試這種方法並測量任何成本。

假設您有一個名為myTrigger. 當您想要繞過觸發器時,程式碼可能如下所示:

-- Create the marker table that indicates that the trigger should be bypassed
CREATE TABLE #bypassTrigger_myTrigger (dummy BIT NOT NULL)
GO
-- Perform the action that would fire the trigger
GO
-- Drop the marker table
DROP TABLE #bypassTrigger_myTrigger
GO

這是觸發器開始時需要執行的邏輯:

--If marker table is present, return immediately before performing any auditing
IF OBJECT_ID('tempdb..#bypassTrigger_myTrigger') IS NOT NULL
BEGIN
   PRINT('Bypassing myTrigger because #bypassTrigger_myTrigger marker table exists.')
   RETURN
END

引用自:https://dba.stackexchange.com/questions/103377