在触发器上添加SET NOCOUNT ON

时间:2015-09-18 09:30:13

标签: sql-server sql-server-2008-r2

我写了几个触发器来保持以这种方式更新几个表的修改时间:

CREATE TABLE foo (
    foo_id INT IDENTITY(1, 1) NOT NULL,
    -- [...]

    created_on DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
    updated_on DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,

    CONSTRAINT foo_pk PRIMARY KEY (foo_id)
);

CREATE TRIGGER foo_trg1 ON foo
FOR UPDATE
AS BEGIN
    UPDATE foo
    SET updated_on = CURRENT_TIMESTAMP
    FROM INSERTED ins
    WHERE foo.foo_id = ins.foo_id;
END;

出于任何原因,我现在没有时间调试,我的PHP客户端代码在发出一系列查询时触发了SQL错误,尽管它只发生在一个特定的表中:

  

触发器返回结果集和/或以SET NOCOUNT OFF运行,而另一个未完成的结果集处于活动状态。

looked up what SET NOCOUNT means并且猜测错误会在我的触发器中启用它,因为它确实发生了:

CREATE TRIGGER foo_trg1 ON foo
FOR UPDATE
AS BEGIN
    SET NOCOUNT ON; -- Problem solved!

    UPDATE foo
    SET updated_on = CURRENT_TIMESTAMP
    FROM INSERTED ins
    WHERE foo.foo_id = ins.foo_id;
END;

我的问题是:

  1. 将它添加到我的所有 updated_on 触发器中是否安全?
  2. 我认为在这种情况下,性能增益可以忽略不计吗?

1 个答案:

答案 0 :(得分:1)

简短的回答是肯定的,将它添加到顶部的任何地方并不是一个坏主意,但有一个警告可能可能不会影响你。

如果您将服务器选项设置为零,则在SSIS内部的事务中使用时,设置NoCount可能会产生一些意外的副作用。

Exec sp_configure 'show advanced options', 1
reconfigure
Exec sp_configure 'disallow results from triggers', 1
reconfigure

允许来自触发器的结果集是不推荐使用的功能,最终将被删除(通过将上述设置设置为1开箱即可)。

如果您对更改服务器范围设置感到不舒服,并且您在SSIS包中遇到奇怪的交易错误,请在触发器结束时将NoCount设置为Off。

另外请记住,触发器中发生的事情是任何调用过程的一部分,因此如果出于任何原因在触发器触发的表更改之前将NoCount设置为Off,则该值将被重置。

相关问题