SQL Server 禁用所有触发器 - 找不到对象“XXXX”,因为它不存在或您没有权限

Posted

技术标签:

【中文标题】SQL Server 禁用所有触发器 - 找不到对象“XXXX”,因为它不存在或您没有权限【英文标题】:SQL Server Disabling All Triggers - Cannot find the object "XXXX" because it does not exist or you do not have permissions 【发布时间】:2011-11-02 20:28:00 【问题描述】:

我正在尝试在 SQL Server 中运行此命令:

disable trigger all on MYDB

这对我来说是失败的。我登录的帐户可以访问 MYDB,并且我几乎授予了它每一个可用的权限(它是一个本地数据库并且只有我的帐户,所以这没关系)。我不明白为什么它告诉我找不到 MYDB?我以前做过。另请注意:我可以从数据库中选择、更新和运行授权语句(例如授权执行 proc)。我也可以手动禁用触发器...

那么为什么会失败呢?我之前可以做到...

谢谢。

【问题讨论】:

你能发布实际的错误信息吗?我确定它没有说XXXX 将XXX替换为数据库名称,完全相同。 【参考方案1】:
sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'

要启用所有触发器,您可以使用以下语句

sp_msforeachtable 'ALTER TABLE ? ENABLE TRIGGER all'

【讨论】:

注意 - 如果您的数据库区分大小写,那么您将不得不使用 sp_MSforeachtable 我必须在存储过程前面使用exec,例如exec sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'; 成功了!一张纸条。在 Azure SQL 中没有 sp_msforeachtable,因此您必须创建它。查看gist.githubusercontent.com/metaskills/893599/raw/…【参考方案2】:

不知道为什么 Yuck 删除了他们的答案。来自DISABLE TRIGGER:

对象名称 是创建 DML 触发器 trigger_name 以执行的表或视图的名称。

也就是说,您不能为此语句提供数据库名称。虽然MYDB 数据库 存在,但其中没有一个名为MYDB 的对象。

【讨论】:

Yuck 因为我的评论删除了他的答案。 DATABASE 上的 DISABLE TRIGGER ALL 出于某种原因不执行任何操作...表示成功,但所有触发器均已启用。但是是的,在结构上,使用 DISABLE TRIGGER 是有意义的。【参考方案3】:
use MYDB;
disable trigger all on DATABASE;

【讨论】:

是的,这是有道理的,但由于某种原因,所有触发器都已启用....奇怪。 奇怪...这种用法由微软声明:msdn.microsoft.com/en-us/library/ms189748.aspx,我只是更正你的语法。 我知道,我是这么想的。它确实有效,但刷新和触发器仍然启用......不知道为什么...... 查看那些文档,我猜这仅适用于在数据库范围内声明的触发器,而不适用于在表事件上声明的触发器。

以上是关于SQL Server 禁用所有触发器 - 找不到对象“XXXX”,因为它不存在或您没有权限的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server Management Studio 2005 中禁用“保存”提示

SQL Server:检查触发器是启用还是禁用?

sql2008 怎么调试触发器

SQL server查看触发器是否被禁用

SQL Server触发器的禁用和启用

本地 SQL Server:找不到指定的过程