sql-server - 更新触发器导致 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
然后我可以无错误地更新行。
有人知道这里发生了什么吗?也许我可以开始调查的一些提示?
解决方案
回答我自己的问题。
问题是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 语句之后。
推荐阅读
- bash - 使用 Azure CLI 创建 VM
- c# - Entity Framework 6 code-first 不创建所有列
- bash - 通过shell脚本添加打印机;在终端中工作,但不能作为 .command
- jekyll - CloudCannon 可视化编辑器不起作用?
- javascript - 比较和组合 xlsx 文件 nodejs 中的两列
- c++ - c++ 以最佳方式返回结构和向量
- python - 将 matplotlib 插值图转换为 Plotly 的绘图方法
- deep-learning - 我应该使用全部可用数据来训练我的深度学习模型吗?仅使用子集的优缺点是什么?
- linux - sed 在 bash 中不起作用,但在命令行中起作用
- python - 将 4x4 图像块旋转 15 度的倍数