Sql-Server-2000
如何確定導致觸發器觸發的程序的名稱
簡短版本: 有沒有人知道一種方法——在 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 的新功能。