2011-04-26 54 views
2

簡版: 有誰知道一種方法 - 在SQL 2000觸發器中 - 檢測哪個進程修改了數據並退出了觸發器如果檢測到特定進程?如何確定導致觸發器觸發的進程的名稱

長版本 我有一個自定義的同步例程,在不相似的數據庫模式之間來回移動數據。

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

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

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

在SQL 2005和起來,我用下面的代碼在同步過程中證明自己的身份:

SET CONTEXT_INFO 0xHexValueOfProcName

每個觸發器必須在開始下面的代碼,看看是否能修改數據的過程同步過程本身:

IF (CONTEXT_INFO() = 0xHexValueOfProcName) 
BEGIN 
-- print '## Process Sync Queue detected. This trigger is exiting! ##' 
    return 
END

該系統的偉大工程,保持車輪繼續滾滾向前,保持數據同步。但現在的問題是SQL2000服務器想要加入該派對。

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

謝謝你們!

+0

你不能使用來自因爲權限的sysprocesses其中SPID = @@ spid''選擇CONTEXT_INFO? – 2011-04-26 16:28:02

+0

我正試圖驗證,現在。如果它有效,這將是偉大的! – datagod 2011-04-26 16:32:05

+0

請發表反饋,如果它(最好是你自己的答案)。 – 2011-04-26 20:56:28

回答

1

(按照舍甫琴科的請求,我回答我的問題。)

我把這個在我的觸發上方,就像一個魅力。

 
-- How to check context info in SQL 2000 
IF ((select CONTEXT_INFO from master..sysprocesses where spid = @@SPID) = 0xHexValueOfProcName) 
BEGIN 
    print 'Sync Process Detected -- Exiting!' 
    return 
END 
相關問題