Answers:
该数据库触发器维基百科文章的礼物是什么触发器是一个很好的概述,当在不同的数据库使用它们。
以下讨论仅基于SQL Server。
当合理使用触发器时,使用触发器是非常有效的。例如,它们在审核(保留数据历史记录)方面具有很好的价值,而无需在每个表上的每个CRUD命令中都使用显式的过程代码。
触发器使您可以在数据更改之前和数据更改之后进行控制。这允许:
经常有人告诉我,只有在确实需要时才使用触发器,并尽可能使用存储过程。
可能是某些原因造成的:
触发器和非触发器存储过程之间的一些区别(以及其他):
触发器是任何复杂数据完整性规则的要求。除数据库以外的任何地方都无法强制执行这些命令,否则您将遇到数据完整性问题。
除非您不希望捕获对数据库的所有更改(这是从应用程序进行审核的问题),否则它们也是进行审核的最佳位置。
如果不仔细编写触发器,并且触发器的知识不足以充分编写触发器,则会导致性能问题。这是他们说唱不好的一部分。
触发器通常比维护数据完整性的其他方法慢,因此,如果可以使用检查约束,请使用它代替触发器。
很容易编写出不好的触发器来执行愚蠢的事情,例如尝试发送电子邮件。如果电子邮件服务器出现故障,您是否真的要无法更改数据库中的记录?
在SQL Server中,触发器对一批记录进行操作。开发人员经常认为他们只需要处理一条记录的插入,更新或删除。这不是发生在数据库上的唯一数据更改,并且应该在1条记录更改和许多条记录更改的条件下测试所有触发器。忘记进行第二项测试可能会导致触发器的执行效果极差或丢失数据完整性。
触发器可用于对数据库强制执行约束,而在数据库模式创建和任何DML语句执行期间不能强制执行触发器。
假设您需要近实时地将数据推送到第三方系统。您的表包含950 GB的数据,因此它太大了,无法仅将整个表推送到第三方应用程序。
相反,您将更改累积在队列中。然后,某些外部程序将定期推出少量的排队数据。
该系统具有2000多个存储过程。您还知道源代码中存在大量的sql。为了确保正确填充队列,您必须搜索所有存储的proc和代码,并希望您不要错过任何内容。
相反,您可以在表上放置触发器以保持队列更新。保证不会错过任何东西。一个中心位置。性能损失?并不是真的,因为无论是通过触发器还是外部,都无法避免填充队列的麻烦。
在这种情况下,我会说不使用触发器是一个错误的设计选择。如果以后要使用一种新的推送数据的方法(例如,队列未解决),并且使用触发器则可以保护接口更改。触发器通常是最佳选择。不要听教条主义的反触发迷们。
发送电子邮件的触发器不一定是“愚蠢”的想法。愚蠢的是没有预料到设计中的电子邮件中断,并且会优雅地处理电子邮件而不会丢失数据。对于那些懒惰的开发人员来说,他们的“愚蠢”部分对于不存在的错误处理确实是不好的,他们认为自己可以避免犯错误。
我还将提供这样的观察:通过调用存储过程/函数可以使触发器保持简单,该存储过程/函数可以任意复杂,并且可以被多个触发器或其他存储过程重用。这就是为什么有包和库的原因。
偏执确实是残酷的。