触发器返回结果集,服务器选项'disallow results from triggers'为true

时间:2011-03-31 20:23:09

标签: sql-server-2005 triggers ssms

我有一个针对不返回结果集的表运行的触发器:

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)

回答

当我撰写这个问题时,我们发现了问题。我仍然会问这个问题,因为对于有这个神秘问题的人来说,答案可以证明是非常非常有用。

另见

1 个答案:

答案 0 :(得分:3)

问题的解决方案原因是启用了SSMS选项包含实际执行计划

SQL Server(错误地)计算包含触发器返回的执行计划信息的“机密”结果集。


关闭选项以查看执行计划,它可以正常运行。这使得跟踪执行计划变得困难,因为您不允许查看执行计划。

这很可能是SQL Server 2005中的一个错误。