我正在使用SQL SERVER 2014。
我有table
,其中有2个触发器(for update
)。
触发器1 - 更新列A
。 (导致触发器2被调用)
触发器2 - 更新列B
。 (导致触发器1被调用)
问题:
在触发器中 - 是否可以识别当前更新是通过触发器触发的?
示例:
1-用户更新了表格
2-触发器1更新列A
3 -Trigger 2由于步骤2而被调用。
4 - 在Trigger 2中 - 是否有任何代码可以通过步骤2中的触发检测到更新?
答案 0 :(得分:1)
您是否尝试使用CONTEXT_INFO()
?
ALTER TRIGGER test1
ON table
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF NOT UPDATE(x)
RETURN;
DECLARE @ci varbinary(128) = CAST('Trigger=' + cast(OBJECT_NAME(@@PROCID) AS varchar(128)) + REPLICATE(' ', 128) as varbinary(128));
SET CONTEXT_INFO @ci;
UPDATE table
SET a = 1
WHERE id = 1;
SET CONTEXT_INFO 0x0; -- clear
END
GO
alter TRIGGER test2
ON table
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF NOT UPDATE(a)
RETURN;
DECLARE @ci varchar(128) = (SELECT CAST(CONTEXT_INFO() AS varchar) FROM master.dbo.SYSPROCESSES WHERE spid = @@SPID);
DECLARE @log varchar(2048) = CONCAT('CALLER:', @ci);
EXEC xp_logevent 60000, @log, informational;
-- update b
END
GO
这给我留言:
Date 19.09.2017 18:31:21
Log SQL Server (Current - 19.09.2017 18:29:00)
Source spid74
Message
CALLER:Trigger=test1