【问题标题】:Update trigger causing SQL error "Cannot find the object "XXX" because it does not exist or you do not have permissions."更新触发器导致 SQL 错误“找不到对象“XXX”,因为它不存在或您没有权限。”
【发布时间】:2020-07-06 08:53:52
【问题描述】:

我遇到了似乎是权限问题。

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

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 插入和删除行,但是每当我去更新my_table 时,我都会收到以下SQL 错误:

消息 1088,级别 16,状态 13,过程 my_table_u,第 16 行 [Batch Start Line 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

然后我能够无错误地更新行。

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

【问题讨论】:

  • 您试图在创建触发器之前启用它,实际上它无论如何都已创建启用,因此您不需要启用它。但是如果你这样做了,你会在ENDALTER TABLE之间放置一个GO
  • @DaleK 感谢您指出这一点。像您建议的那样在 END 和 ALTER TABLE 之间放置 aa GO 确实有效(允许我更新行),但是,我仍然很好奇两者的 不同 会使一个人的行为不同于其他。在最后一个 GO 之前创建触发器仍然成功完成,并且仍然允许超级/管理员用户更新一行。有什么想法吗?
  • 从连接/会话中更改数据库结构时,要求您将命令分开,以便在尝试引用新对象之前完成命令。正如我所说,您不需要启用触发器。

标签: sql-server


【解决方案1】:

回答我自己的问题。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2011-11-02
    • 2010-11-11
    • 2016-11-22
    • 2015-05-27
    • 2017-03-19
    相关资源
    最近更新 更多