短版本: 有没有人知道一种方法 - 一种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 :(得分:1)
(根据Andriy的要求,我正在回答我自己的问题。)
我把它放在触发器的顶部,就像一个魅力。
-- 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