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

29

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

disable trigger all on MYDB

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

那么为什么会失败?我以前能做到啊...

谢谢。


2
你能发布实际的错误信息吗?我确定它不会说 XXXX - JNK
将XXX替换为数据库名称,完全相同。 - Brian Mains
3个回答

94
sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'

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

sp_msforeachtable 'ALTER TABLE ? ENABLE TRIGGER all'

3
注意 - 如果您的数据库区分大小写,则必须使用sp_MSforeachtable。 - Crab Bucket
1
我必须在存储过程前使用 "exec",例如 exec sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'; - styfle
1
成功了!不过需要注意的是,在Azure SQL中没有sp_msforeachtable,所以你需要自己创建它。可以参考https://gist.githubusercontent.com/metaskills/893599/raw/003b0d5ffa8e9aa6d1f600a89ff5f60438044c5c/gistfile1.sql - Alfredo A.

0
use MYDB;
disable trigger all on DATABASE;

1
是的,那很有道理,但出于某种原因,所有触发器都被启用了...奇怪。 - Brian Mains
1
奇怪...这个用法是由微软宣布的:http://msdn.microsoft.com/en-us/library/ms189748.aspx,我只是纠正了你的语法。 - Badiboy
我知道,我也是这么认为的。它确实可以工作,但刷新后触发器仍然启用...不确定原因是什么... - Brian Mains
11
看这些文档,我猜想这只适用于在数据库范围内声明的触发器,而不是在表事件上声明的触发器。 - StriplingWarrior

0

不确定为什么Yuck删除了他们的回答。从DISABLE TRIGGER

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

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


Yuck因为我的评论删除了他的答案。DISABLE TRIGGER ALL on DATABASE 没有任何作用,原因不明... 显示成功,但所有触发器都已启用。但是在结构上使用DISABLE TRIGGER是有意义的。 - Brian Mains

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接