2011-04-26 51 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 
相关问题