Sql-Server-2000

如何確定導致觸發器觸發的程序的名稱

  • April 26, 2011

簡短版本: 有沒有人知道一種方法——在 SQL 2000 觸發器中——檢測哪個程序修改了數據,如果檢測到特定程序則退出觸發器?

長版 我有一個自定義的同步常式,可以在不同的數據庫模式之間來回移動數據。

當這個過程從數據庫 A 中抓取一條修改過的記錄時,它需要將其轉換為進入數據庫 B 的記錄。數據庫完全不同,但共享一些相同的數據,例如使用者帳戶和使用者活動(但即使是這些表結構不同)。

當在其中一個相關表中修改數據時,會觸發一個觸發器,該觸發器將該記錄的 PK 寫入“同步”表。此“同步”表由一個程序(儲存過程)監控,該程序將按順序獲取 PK,並將相關數據從數據庫 A 複製到數據庫 B,並根據需要進行轉換。

兩個數據庫都有觸發並將 PK 複製到同步表的觸發器,但是這些觸發器必須忽略同步過程本身,以免進入“無限”循環(或更少,取決於嵌套限制)。

在 SQL 2005 及更高版本中,我在同步過程中使用以下程式碼來標識自己:

SET CONTEXT_INFO 0xHexValueOfProcName

每個觸發器開頭都有如下程式碼,看看修改數據的程序是不是同步程序本身:

IF (CONTEXT_INFO() = 0xHexValueOfProcName)
開始
-- print '## 檢測到程序同步隊列。此觸發器正在退出!##'
返回
結尾

該系統執行良好,保持同步,保持數據同步。然而,現在的問題是 SQL2000 伺服器想要加入該聚會。

有誰知道一種方法——在 SQL 2000 觸發器中——檢測哪個程序修改了數據,並在檢測到特定程序時退出觸發器?

多謝你們!

SQL Server 2000 也存在SET CONTEXT_INFO 。

但是,您必須查詢sysprocesses.context_info才能讀回它。CONTEXT_INFO()是 SQL Server 2005 的新功能。

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