0

所以首先让我承认我是一个 SQL Server 新手。

这是交易:我正在尝试在 SQL Server 2012 中的表上创建触发器,并且每当我SELECT在触发器中尝试任何类型的语句时,表都会停止工作(因为在删除触发器之前可以插入任何内容)。我一放下扳机,一切就又开始工作了。如果我不做任何SELECT事情,一切都是桃子。是否有许可或我缺少的地方?

例子:

CREATE TRIGGER sometrigger
ON sometable
FOR INSERT
AS
BEGIN
    SELECT * FROM inserted
END
GO

命令成功完成,但如上所述,表被冻结。

CREATE TRIGGER sometrigger
ON sometable
FOR INSERT
AS
BEGIN
    EXEC msdb.dbo.sp_send_dbmail
    @recipients = N'someaddress@somedomain.com',
    @subject = 'test',
    @body = 'test body',
    @profile_name = 'someprofile'
END
GO

奇迹般有效。

4

2 回答 2

0

无论如何,您都不应该从触发器返回数据,主要是出于简单和维护的原因。这很令人困惑:我做了一个 INSERT 但得到了一个结果集。

如果您需要获取刚刚插入的值,您可以使用 OUTPUT 子句

INSERT sometable (...)
OUTPUT INSERTED.*
VALUES (...);

这至少告诉您 INSERT 给出了结果。

它也可以嵌套,例如SQL Server 并发事务问题

于 2013-05-21T14:35:37.060 回答
0

您可能会因为触发器选项设置为 1 而违反不允许结果,因为它应该是。

请注意该页面上的警告:

此功能将在 Microsoft SQL Server 的下一版本中删除。不要在新的开发工作中使用此功能,并尽快修改当前使用此功能的应用程序。我们建议您将此值设置为 1。

我怀疑无论您在哪里运行插入,都会隐藏错误消息或异常,因为您应该得到:

消息 524,级别 16,状态 1,程序,行

“触发器返回了一个结果集,并且服务器选项 'disallow_results_from_triggers' 为真。”


或者,在另一种情况下,您正在使用一个数据库层,该层将所有插入包装在事务中,如果发生任何意外情况(例如接收结果集或什至只是一条额外的信息消息),它将回滚事务(x rows affected)

但所有这一切都围绕着主要问题展开——您不应该发出一个尝试从触发器内部返回结果的选择。如果你真的告诉我们你想要达到的目标,我可能会提供更多帮助。

如果是第二种情况,并且是(x rows affected)消息绊倒了某些东西,则可以通过将其放在SET NOCOUNT ON触发器的顶部来解决。

于 2013-05-21T14:31:43.903 回答