我写了几个触发器来保持以这种方式更新几个表的修改时间:
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;
我的问题是:
答案 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,则该值将被重置。