我有一个针对不返回结果集的表运行的触发器:
ALTER TRIGGER [dbo].[LogDelete_Nodes] ON [dbo].[Nodes]
FOR DELETE
AS
BEGIN
SET NOCOUNT ON;
/* Load the saved context info UserGUID */
DECLARE @SavedUserGUID uniqueidentifier
SET @SavedUserGUID = (SELECT CAST(context_info as uniqueidentifier)
FROM master.dbo.sysprocesses
WHERE spid = @@SPID)
--remaining trigger contents deleted to provide simple example
END;
从Nodes
表中删除行将导致错误:
消息524,级别16,状态1,过程LogDelete_Nodes,第10行
触发器返回结果集,服务器选项'disallow results from triggers'为真。
如何使不返回结果集的触发器不返回结果集?
注意:触发器最初定义为使用非弃用语法来设置变量:
SELECT @SavedUserGUID = CAST(context_info as uniqueidentifier)
FROM master.dbo.sysprocesses
WHERE spid = @@SPID
它仍然会出现同样的错误。
SELECT @@version
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59
Copyright (C) 1988-2005 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
当我撰写这个问题时,我们发现了问题。我仍然会问这个问题,因为对于有这个神秘问题的人来说,答案可以证明是非常非常有用。
答案 0 :(得分:3)
问题的解决方案原因是启用了SSMS选项包含实际执行计划。
SQL Server(错误地)计算包含触发器返回的执行计划信息的“机密”结果集。
关闭选项以查看执行计划,它可以正常运行。这使得跟踪执行计划变得困难,因为您不允许查看执行计划。
这很可能是SQL Server 2005中的一个错误。