问题
我需要主进程上下文中的信息,这些信息只在触发器上下文中可用。
解决方案
是否得到
@@ROWCOUNT
或者别的什么
从
触发器,甚至传递信息
到
作为触发器,有两种方法允许与触发器共享信息:
我发布了一个使用
CONTEXT_INFO
在DBA.StackExchange上回答相关问题时:
Passing info on who deleted record onto a Delete trigger
. 在对这个答案的评论中有一个讨论,涉及到围绕着
上下文信息
,所以我发布了
another answer
在那个问题上用临时表代替。
因为那个例子涉及发送信息
到
触发器,下面是获取信息的示例
从
这就是问题的关键所在:
第一:
创建一个简单的表
CREATE TABLE dbo.InsteadOfTriggerTest (Col1 INT);
第二:
创建触发器
CREATE TRIGGER dbo.tr_InsteadOfTriggerTest
ON dbo.InsteadOfTriggerTest
INSTEAD OF INSERT
AS
BEGIN
PRINT 'Trigger (starting): ' + CONVERT(NVARCHAR(50), @@ROWCOUNT);
SET NOCOUNT ON; -- do AFTER the PRINT else @@ROWCOUNT will be 0
DECLARE @Rows INT;
INSERT INTO dbo.InsteadOfTriggerTest (Col1)
SELECT TOP (5) ins.Col1
FROM inserted ins;
SET @Rows = @@ROWCOUNT;
PRINT 'Trigger (after INSERT): ' + CONVERT(NVARCHAR(50), @Rows);
-- make sure temp table exists; no error if table is missing
IF (OBJECT_ID('tempdb..#TriggerRows') IS NOT NULL)
BEGIN
INSERT INTO #TriggerRows (RowsAffected)
VALUES (@Rows);
END;
END;
第三:
做测试
SET NOCOUNT ON;
IF (OBJECT_ID('tempdb..#TriggerRows') IS NOT NULL)
BEGIN
DROP TABLE #TriggerRows;
END;
CREATE TABLE #TriggerRows (RowsAffected INT);
INSERT INTO dbo.InsteadOfTriggerTest (Col1)
SELECT so.[object_id]
FROM [master].[sys].[objects] so;
PRINT 'Final @@ROWCOUNT (what we do NOT want): ' + CONVERT(NVARCHAR(50), @@ROWCOUNT);
SELECT * FROM #TriggerRows;
输出(在“消息”选项卡中):
触发器(启动):91
触发器(插入后):5
Final@@ROWCOUNT(我们不想要的):91
结果:
感染罗莎芬
五