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”,因为它不存在或您没有权限的主要内容,如果未能解决你的问题,请参考以下文章