【发布时间】: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
然后我我能够无错误地更新行。
有人知道这里发生了什么吗?也许我可以开始调查一些提示?
【问题讨论】:
-
您试图在创建触发器之前启用它,实际上它无论如何都已创建启用,因此您不需要启用它。但是如果你这样做了,你会在
END和ALTER TABLE之间放置一个GO -
@DaleK 感谢您指出这一点。像您建议的那样在 END 和 ALTER TABLE 之间放置 aa GO 确实有效(允许我更新行),但是,我仍然很好奇两者的 不同 会使一个人的行为不同于其他。在最后一个 GO 之前创建触发器仍然成功完成,并且仍然允许超级/管理员用户更新一行。有什么想法吗?
-
从连接/会话中更改数据库结构时,要求您将命令分开,以便在尝试引用新对象之前完成命令。正如我所说,您不需要启用触发器。
标签: sql-server