首页 > 解决方案 > 更新触发器导致 SQL 错误“找不到对象“XXX”,因为它不存在或您没有权限。”

问题描述

我遇到了似乎是许可问题。

我有一个使用在行更新后运行的触发器创建的数据库表。这些是我用来创建触发器的命令:

CREATE TRIGGER [dbo].[my_table_u]
ON [dbo].[my_table]
after UPDATE
AS
  BEGIN
      SET nocount ON;
      UPDATE my_table
      SET
          last_updated_by = ( Host_name() + Suser_name() ),
          last_updated_dt = Getdate()
      FROM my_table
      INNER JOIN inserted ON my_table.id = inserted.id
  END
ALTER TABLE [dbo].[my_table] ENABLE TRIGGER [my_table_u]
GO

我可以从中插入和删除行my_table,但是每当我去 update 时my_table,我都会收到以下 SQL 错误:

消息 1088,级别 16,状态 13,过程 my_table_u,第 16 行 [批处理开始行 0] 找不到对象“my_table”,因为它不存在或您没有权限。

但是,如果我在没有最后一个 ENABLE TRIGGER 命令的情况下删除并重新创建触发器,如下所示:

CREATE TRIGGER [dbo].[my_table_u]
ON [dbo].[my_table]
after UPDATE
AS
  BEGIN
      SET nocount ON;
      UPDATE my_table
      SET
          last_updated_by = ( Host_name() + Suser_name() ),
          last_updated_dt = Getdate()
      FROM my_table
      INNER JOIN inserted ON my_table.id = inserted.id
  END
/*** NO ENABLE TRIGGER COMMAND HERE ***/
GO

然后我可以无错误地更新行。

有人知道这里发生了什么吗?也许我可以开始调查的一些提示?

标签: sql-server

解决方案


回答我自己的问题。

问题是ALTER TABLE [dbo].[my_table] ENABLE TRIGGER [my_table_u]原始 CREATE TIGGER 命令中的行最终成为更新触发器的一部分。也就是说,每当此触发器运行时,它也会尝试运行ALTER TABLE...ENABLE TRIGGER,并且我的用户没有授予 ALTER 权限。

当我授予用户 ALTER 权限时my_table,这一点得到了证实,问题就消失了。

正如 Dale K 在评论中指出的那样,“正确”的解决方案是完全省略 ENABLE TRIGGER 命令,或者确保它出现创建触发器的 GO 语句之后。


推荐阅读