根据我的经验,它们不是一个好主意,因为它们可能会导致令人惊讶的副作用,并且很难调试(特别是当一个触发器触发另一个触发器时)。通常情况下,开发人员甚至不会考虑是否存在触发因素。
另一方面,如果每次在数据库中创建新FOO时都必须执行逻辑,那么将其放在FOO表上的插入触发器可能是最安全的地方。
我们唯一使用触发器的时候是非常简单的事情,比如设置一行的修改日期字段。
我正在努力弄清楚触发器是否有必要,并感谢任何建议。如果它们是必要的,在实施它们时要考虑的最重要的问题是什么?
根据我的经验,它们不是一个好主意,因为它们可能会导致令人惊讶的副作用,并且很难调试(特别是当一个触发器触发另一个触发器时)。通常情况下,开发人员甚至不会考虑是否存在触发因素。
另一方面,如果每次在数据库中创建新FOO时都必须执行逻辑,那么将其放在FOO表上的插入触发器可能是最安全的地方。
我们唯一使用触发器的时候是非常简单的事情,比如设置一行的修改日期字段。
我正在努力弄清楚触发器是否有必要,并感谢任何建议。如果它们是必要的,在实施它们时要考虑的最重要的问题是什么?
当前回答
他们绝对不是邪恶的。我发现在重构数据库模式、重命名列或将列分成两列或相反(例如:姓名/姓氏情况)并协助转换时,触发器非常宝贵。
它们对于审计也非常有用。
其他回答
我同意。触发器的问题在于人,而不是触发器。尽管要看得更多,要考虑得更多,并且增加了编码员正确检查内容的责任,但我们不会为了简化工作而放弃索引。(糟糕的索引和糟糕的触发器一样糟糕)
触发器的重要性(在我看来)是…… -任何系统都应该始终处于有效状态 执行这种有效状态的代码应该集中(而不是写在每个SP中)
从维护的角度来看,触发器对于有竞争力的程序员和初级/业余程序员的问题非常有用。然而,这些人需要学习和成长。
我想这取决于你的工作环境。你有值得信赖的人吗?他们学习能力强,做事有条理?如果不是,你似乎有两个选择: -接受你不得不失去功能来补偿的事实 -接受你需要不同的人或更好的培训和管理
这些话听起来很刺耳,我想的确如此。但在我看来,这是基本事实……
工具从来都不是邪恶的。 这些工具的应用可能是邪恶的。
事实上,触发器经常被滥用。事实上,在大多数情况下,你甚至不需要它们。但这并不意味着它们就一定是坏事。
我想到的一个触发器很有用的场景是,当你有一个遗留应用程序,你没有源代码,也没有办法改变它。
不,他们不邪恶——他们只是被误解了:- d
触发器有一个有效的用途,但往往是作为一个复古黑客,最终使事情变得更糟。
如果您将DB作为应用程序的一部分进行开发,那么逻辑应该始终存在于进行调用的代码或scprocs中。触发器只会导致稍后的调试痛苦。
如果您了解锁、死锁以及DB如何访问磁盘上的文件,那么以正确的方式使用触发器(例如审计或归档直接DB访问)将非常有价值。
在高层次上,触发器有两个用例1
1)让事情“自动地”发生。在这种情况下,触发器会产生副作用,它们会以超出预期的方式改变数据,因为执行了(原语)操作符insert、update或delete并导致触发器触发。
这里的普遍共识是,触发器确实有害。因为它们改变了INSERT、UPDATE或DELETE语句的众所周知的语义。更改这三个原语SQL操作符的语义将会对其他开发人员造成不利影响,这些开发人员将来需要对数据库表进行操作,而这些表在使用SQL原语操作时不再以预期的方式运行。
2)执行数据完整性规则,而不是我们可以声明式处理的规则(使用CHECK, PRIMARY KEY, UNIQUE KEY和外键)。在这个用例中,所有触发器所做的就是查询(SELECT)数据,以验证由INSERT/UPDATE/DELETE所做的更改是否被允许。就像声明性约束对我们的作用一样。只有在这种情况下,我们(开发人员)才编写了实施程序。
对于后一种用例,使用触发器是无害的。
我的博客地址是:http://harmfultriggers.blogspot.com