简短版本: 有谁知道一种方法——在 SQL 2000 触发器中——检测哪个进程修改了数据,并在检测到特定进程时退出触发器?
长版本 我有一个自定义的同步例程,可以在不同的数据库模式之间来回移动数据。
当此过程从数据库 A 获取修改后的记录时,它需要将其转换为进入数据库 B 的记录。数据库完全不同,但共享一些相同的数据,例如用户帐户和用户活动(但即使是这些表结构不同)。
当其中一个相关表中的数据被修改时,将触发一个触发器,该触发器将该记录的 PK 写入“同步”表。这个“同步”表由一个进程(存储过程)监控,该进程将按顺序获取 PK,并将相关数据从数据库 A 复制到数据库 B,并根据需要进行转换。
两个数据库都有触发并将 PK 复制到同步表的触发器,但是这些触发器必须忽略同步过程本身,以免进入“无限”循环(或更少,取决于嵌套限制)。
在 SQL 2005 及更高版本中,我在 Sync 过程中使用以下代码来标识自身:
SET CONTEXT_INFO 0xHexValueOfProcName
每个trigger开头都有如下代码,查看修改数据的进程是不是sync进程本身:
IF (CONTEXT_INFO() = 0xHexValueOfProcName) 开始 -- print '## 检测到进程同步队列。此触发器正在退出!##' 返回 结尾
这个系统工作得很好,继续前进,保持数据同步。然而,现在的问题是 SQL2000 服务器想要加入聚会。
有谁知道一种方法——在 SQL 2000 触发器中——检测哪个进程修改了数据,并在检测到特定进程时退出触发器?
多谢你们!
SQL Server 2000 也存在SET CONTEXT_INFO 。
但是,您必须查询
sysprocesses.context_info
才能读回。CONTEXT_INFO()
是 SQL Server 2005 的新增功能。