根据我的经验,它们不是一个好主意,因为它们可能会导致令人惊讶的副作用,并且很难调试(特别是当一个触发器触发另一个触发器时)。通常情况下,开发人员甚至不会考虑是否存在触发因素。
另一方面,如果每次在数据库中创建新FOO时都必须执行逻辑,那么将其放在FOO表上的插入触发器可能是最安全的地方。
我们唯一使用触发器的时候是非常简单的事情,比如设置一行的修改日期字段。
我正在努力弄清楚触发器是否有必要,并感谢任何建议。如果它们是必要的,在实施它们时要考虑的最重要的问题是什么?
根据我的经验,它们不是一个好主意,因为它们可能会导致令人惊讶的副作用,并且很难调试(特别是当一个触发器触发另一个触发器时)。通常情况下,开发人员甚至不会考虑是否存在触发因素。
另一方面,如果每次在数据库中创建新FOO时都必须执行逻辑,那么将其放在FOO表上的插入触发器可能是最安全的地方。
我们唯一使用触发器的时候是非常简单的事情,比如设置一行的修改日期字段。
我正在努力弄清楚触发器是否有必要,并感谢任何建议。如果它们是必要的,在实施它们时要考虑的最重要的问题是什么?
当前回答
这个答案特别适用于SQL Server。(虽然它也可能适用于其他rdbms,我不知道。我更愿意在这里给出一个答案,但这是一个抄袭。)
到目前为止,所有答案中都没有提到的一个方面是安全性。因为在默认情况下,触发器是在执行触发触发器的语句的用户的上下文中执行的,这可能会导致安全威胁,除非检查所有触发器。
在BOL中“管理触发器安全性”标题下给出的示例是一个用户创建了一个包含代码GRANT CONTROL SERVER TO JohnDoe的触发器;以便升级自己的权限。
其他回答
如果有副作用,那就是故意造成的问题。 在一些数据库系统中,没有其他方法可以设置一个自增字段,即主键ID字段。
工具从来都不是邪恶的。 这些工具的应用可能是邪恶的。
触发器是非常强大和有用的,在许多情况下,触发器是解决问题的最佳方案。
它们也是一个非常好的“黑客”工具。通常情况下,您不能立即控制代码和数据库。如果您必须等待2个月才能看到代码的下一个主要版本,但您可以立即将补丁应用到数据库,然后您可以在表上放置触发器来执行一些额外的功能。然后,当代码可能发布时,如果需要,您可以用相同功能的编码版本替换此触发器。
在一天结束的时候,如果你不知道它在做什么,一切都是“邪恶的”。决定触发器是因为开发者不理解它们,这就像争论汽车是邪恶的,因为有些人不会开车……
触发器的概念并不邪恶,限制触发器的嵌套是邪恶的。
如果使用得当,触发器是一个很好的工具。特别是对于审计变更、填充汇总表等。
Now they can be "evil" if you end up in "trigger hell" with one trigger that kicks off other triggers. I once worked on a COTS product where they had what they called "flex triggers." These triggers were stored in a table as dynamic sql stings are were compiled every time they were executed. Compiled triggers would do a look up and see if that table had any flex triggers to run and then compile and run the "flex" trigger. In theory this sounded like a really cool idea because the product was easily customized but the reality was the database pretty much exploded due to all the compiles it had to do...
所以,如果你正确地看待你所做的事情,它们是很棒的。如果是一些非常简单的事情,如审核、总结、自动排序等,那就没问题。只需要记住表的增长速度以及触发器将如何影响性能。