我正在使用SQL SERVER 2014。
我有一个table,其中有2个触发器(for update)。
触发器1-更新列A。(这将导致调用触发器2)
触发器2-更新列B。(导致调用触发器1)
问题:
在触发器中-是否能够识别当前更新是通过触发器触发的?
例子:
1-用户更新了表
2-触发1次更新,A列
3由于步骤2调用了-Trigger 2。
4-在触发器2-是否有任何代码可以检测到更新是通过触发器在step2?
发布于 2017-09-19 15:43:11
你试过用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=test1https://stackoverflow.com/questions/46297910
复制相似问题