根据我的经验,它们不是一个好主意,因为它们可能会导致令人惊讶的副作用,并且很难调试(特别是当一个触发器触发另一个触发器时)。通常情况下,开发人员甚至不会考虑是否存在触发因素。
另一方面,如果每次在数据库中创建新FOO时都必须执行逻辑,那么将其放在FOO表上的插入触发器可能是最安全的地方。
我们唯一使用触发器的时候是非常简单的事情,比如设置一行的修改日期字段。
我正在努力弄清楚触发器是否有必要,并感谢任何建议。如果它们是必要的,在实施它们时要考虑的最重要的问题是什么?
根据我的经验,它们不是一个好主意,因为它们可能会导致令人惊讶的副作用,并且很难调试(特别是当一个触发器触发另一个触发器时)。通常情况下,开发人员甚至不会考虑是否存在触发因素。
另一方面,如果每次在数据库中创建新FOO时都必须执行逻辑,那么将其放在FOO表上的插入触发器可能是最安全的地方。
我们唯一使用触发器的时候是非常简单的事情,比如设置一行的修改日期字段。
我正在努力弄清楚触发器是否有必要,并感谢任何建议。如果它们是必要的,在实施它们时要考虑的最重要的问题是什么?
当前回答
不是邪恶的。它们实际上简化了事情
1.记录/审计对记录甚至数据库模式的更改
您可以在ALTER TABLE上设置一个触发器,用于回滚生产环境中的更改。这应该可以防止任何意外的表修改。
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...
所以,如果你正确地看待你所做的事情,它们是很棒的。如果是一些非常简单的事情,如审核、总结、自动排序等,那就没问题。只需要记住表的增长速度以及触发器将如何影响性能。
他们绝对不是邪恶的。我发现在重构数据库模式、重命名列或将列分成两列或相反(例如:姓名/姓氏情况)并协助转换时,触发器非常宝贵。
它们对于审计也非常有用。
我知道有些开发人员认为触发器应该总是用于实现他们想要的功能的最直接方式,而有些开发人员则永远不会这样做。这几乎就像是两个阵营之间的教条。
然而,我个人完全同意MarkR -你可以(几乎)总是编写与触发器功能相当的代码,这将更清晰,因此更容易维护。
不是邪恶的。它们实际上简化了事情
1.记录/审计对记录甚至数据库模式的更改
您可以在ALTER TABLE上设置一个触发器,用于回滚生产环境中的更改。这应该可以防止任何意外的表修改。
2.跨多个数据库强制执行引用完整性(主键/外键关系等)
我认为它们可以是邪恶的,但只能和其他正在开发的东西一样邪恶。
虽然我并没有太多使用它们的经验,但我在最近的一个项目中使用了它们,这让我得出了这个结论。我遇到的问题是,它们可能导致业务逻辑在两个位置结束,一个代码库和一个数据库。
我认为这与使用scprocs类似。您经常会遇到一些开发人员,他们非常擅长将业务逻辑写入SQL到数据库中,而那些不擅长的人将业务逻辑放在其他地方。
所以我的经验法则是看看你项目的结构是什么。如果在数据库中存储业务逻辑似乎是可行的,那么使用触发器可能是有用的。