我编写了几个触发器来以这种方式更新多个表的修改时间:
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 错误,尽管它只发生在一个特定的表中:
A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active.
我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;
我的问题是:
- 将其添加到我的所有 updated_on 触发器中是否安全?
- 我的假设在这种情况下性能提升可以忽略不计,这样正确吗?
最佳答案
简短的答案是肯定的,将其添加到所有位置的顶部并不是一个坏主意,但需要注意的是,这可能或可能不会影响您。
如果您将服务器选项设置为零,则在 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,则该值将被重置。
关于sql-server - 在触发器顶部添加 SET NOCOUNT ON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32648590/