如何确定导致触发器触发的进程的名称

时间:2011-04-26 16:23:48

标签: sql sql-server sql-server-2000

短版本: 有没有人知道一种方法 - 一种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触发器 - 检测哪个进程修改了数据,并在检测到特定进程时退出触发器?

谢谢你们!

1 个答案:

答案 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