![](/img/trans.png)
[英]Cannot find the object because it does not exist or you do not have permissions. Error in SQL Server
[英]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.