簡體   English   中英

更新觸發器導致 SQL 錯誤“找不到對象“XXX”,因為它不存在或您沒有權限。”

[英]Update trigger causing SQL error "Cannot find the object "XXX" because it does not exist or you do not have permissions."

我遇到了似乎是許可問題的問題。

我有一個數據庫表,我創建了一個在行更新后運行的觸發器。 這些是我用來創建觸發器的命令:

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 行 [批處理起始行 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

然后,可以沒有錯誤更新行。

有人會知道這里發生了什么嗎? 也許我可以開始調查一些提示?

回答我自己的問題。

問題是原始 CREATE TIGGER 命令中的ALTER TABLE [dbo].[my_table] ENABLE TRIGGER [my_table_u]最終成為更新觸發器的一部分 也就是說,每當此觸發器運行時,它也會嘗試運行ALTER TABLE...ENABLE TRIGGER ,並且我的用戶沒有被授予 ALTER 權限。

當我在my_table上授予用戶 ALTER 權限時確認了這一點,問題就消失了。

正如 Dale K 在評論中指出的那樣,“正確”的解決方案是完全省略 ENABLE TRIGGER 命令,或者確保它位於創建觸發器的 GO 語句之后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM