有没有办法阻止触发器被禁用?

时间:2010-06-17 10:02:25

标签: sql sql-server sql-server-2005 sql-server-2008

我在表上有一个永远不会被禁用的触发器。它执行某些检查,并且有时其他开发人员已禁用它来绕过它。这不好,所以我希望能够仅在此表上关闭触发器禁用。这可能吗?如果没有,请提出任何建议。感谢。

替代方法: 从窥视反应看似无法阻止它。也许获得警报是合适的。这是一篇很好的文章,遗憾的是它不能与EventData一起使用。也许在2008年,这个解决了: http://www.simple-talk.com/sql/database-administration/dml-trigger-status-alerts/

7 个答案:

答案 0 :(得分:7)

你没有技术问题,你有社会问题。

这些“其他开发者”是谁?

他们为什么要调整触发器?

他们的目的是什么?

触发器有什么问题?

你应该和他们交谈并了解他们的问题。

不要浪费时间寻找只会使问题变得更糟或更复杂的技术“解决方案”。找人和他们谈谈。

答案 1 :(得分:5)

无论如何,开发人员都可以禁用任何解决方案,例如DDL triggers

唯一的解决方案是

  • 删除权限以停用触发器
  • 麻袋/射击/伤害开发者,如果他们不会改变

答案 2 :(得分:3)

开发人员不应拥有生产数据库的管理员权限。他们不应该能够禁用触发器,因为除了select之外,他们不应该拥有prod的权利。

人们觉得需要禁用它的触发器有什么问题?写的很糟糕?它不能正确处理多行吗?它是否会阻止他们需要发生的事情发生?

  

在这种情况下,我们有关于如何处理触发器的文档,而不是禁用它(即设置标志),但显然某些开发人员知道的更好。

这向我表明触发器本身就是一个问题。重写它,所以不需要解决方法。

基于评论

为您的数据添加覆盖触发字段。当你想要覆盖它时,发送一个值为1,如果插入的表的值为1,那么就有一个if stament,它忽略了那些你需要忽略的那些记录的触发器部分,然后继续进行并执行其他触发操作。最后,将覆盖字段的值重置为null。

或者,将审计触发器放在单独的触发器中,因此当他们禁用临时禁用的触发器时,审计触发器仍会运行。

或者将“有时我们运行它的东西”完全从触发器中取出并将其添加到将记录放在您希望它运行的进程而不是其他进程的进程中。

答案 3 :(得分:2)

没有。禁用是管理操作,因此无法阻止。您可以检查代码是否禁用触发器....但不能阻止禁用。

有意义,即使是例如开发人员(在调试期间)。

答案 4 :(得分:2)

我倾向于同意HLGEM的评论。你可能在触发器中做了错误的事情,这就是为什么人们觉得需要绕过它。所以摆脱它或重写它。我说“可能”因为几乎所有触发器都是不必要的,并且触发器通常是放置数据操作代码的不好的地方。在不修改数据的情况下强制执行业务规则的触发器是合理的。实际上执行UPDATE,INSERT和DELETE的触发器通常比它们的价值要大得多,并且几乎总是可以用更好的替代方案替换。

答案 5 :(得分:1)

也许您可以创建另一个用户,将其他表上的select / insert / update / delete授予新用户。 或者,您可以撤消对拥有表的用户的触发器的访问权限。

答案 6 :(得分:0)

尽可能使用约束,并确保它们是可信的。