根据我的经验,它们不是一个好主意,因为它们可能会导致令人惊讶的副作用,并且很难调试(特别是当一个触发器触发另一个触发器时)。通常情况下,开发人员甚至不会考虑是否存在触发因素。
另一方面,如果每次在数据库中创建新FOO时都必须执行逻辑,那么将其放在FOO表上的插入触发器可能是最安全的地方。
我们唯一使用触发器的时候是非常简单的事情,比如设置一行的修改日期字段。
我正在努力弄清楚触发器是否有必要,并感谢任何建议。如果它们是必要的,在实施它们时要考虑的最重要的问题是什么?
根据我的经验,它们不是一个好主意,因为它们可能会导致令人惊讶的副作用,并且很难调试(特别是当一个触发器触发另一个触发器时)。通常情况下,开发人员甚至不会考虑是否存在触发因素。
另一方面,如果每次在数据库中创建新FOO时都必须执行逻辑,那么将其放在FOO表上的插入触发器可能是最安全的地方。
我们唯一使用触发器的时候是非常简单的事情,比如设置一行的修改日期字段。
我正在努力弄清楚触发器是否有必要,并感谢任何建议。如果它们是必要的,在实施它们时要考虑的最重要的问题是什么?
当前回答
大多数情况下,是的。
扳机的困难在于它是“在你背后”做事情的;维护应用程序的开发人员很容易没有意识到它的存在,甚至在没有注意到的情况下做了一些更改,把事情搞砸了。
它增加了一层复杂性,增加了维护工作。
不使用触发器,存储过程/例程通常可以做同样的事情,但以一种清晰和可维护的方式-调用存储例程意味着开发人员可以查看其源代码并确切地了解发生了什么。
其他回答
如果有副作用,那就是故意造成的问题。 在一些数据库系统中,没有其他方法可以设置一个自增字段,即主键ID字段。
不,其实这是个好主意。如果你的特定触发器有问题,那么你做得不对,但这通常意味着你的实现有问题,而不是触发器本身的概念:-)。
我们经常使用触发器,因为它将特定于dbms的活动置于其所属数据库的控制之下。DBMS的用户不应该担心这类事情。数据的完整性取决于数据库本身,而不是使用它的应用程序或用户。如果数据库中没有约束、触发器和其他特性,执行规则的任务就留给了应用程序,只需要一个流氓或有bug的应用程序/用户就可以破坏数据。
例如,如果没有触发器,像自动生成列这样奇妙的东西就不存在了,在选择它们时,您必须在每行上处理一个函数。这可能会降低DBMS的性能,在插入/更新时创建自动生成的列要好得多,因为只有在插入/更新时才会更改列。
此外,缺乏触发器将阻止在DBMS中强制执行数据规则,例如预先触发器,以确保列具有特定的格式。注意,这与数据完整性规则不同,后者通常只是外键查找。
我同意。触发器的问题在于人,而不是触发器。尽管要看得更多,要考虑得更多,并且增加了编码员正确检查内容的责任,但我们不会为了简化工作而放弃索引。(糟糕的索引和糟糕的触发器一样糟糕)
触发器的重要性(在我看来)是…… -任何系统都应该始终处于有效状态 执行这种有效状态的代码应该集中(而不是写在每个SP中)
从维护的角度来看,触发器对于有竞争力的程序员和初级/业余程序员的问题非常有用。然而,这些人需要学习和成长。
我想这取决于你的工作环境。你有值得信赖的人吗?他们学习能力强,做事有条理?如果不是,你似乎有两个选择: -接受你不得不失去功能来补偿的事实 -接受你需要不同的人或更好的培训和管理
这些话听起来很刺耳,我想的确如此。但在我看来,这是基本事实……
大多数情况下,是的。
扳机的困难在于它是“在你背后”做事情的;维护应用程序的开发人员很容易没有意识到它的存在,甚至在没有注意到的情况下做了一些更改,把事情搞砸了。
它增加了一层复杂性,增加了维护工作。
不使用触发器,存储过程/例程通常可以做同样的事情,但以一种清晰和可维护的方式-调用存储例程意味着开发人员可以查看其源代码并确切地了解发生了什么。
我认为它们可以是邪恶的,但只能和其他正在开发的东西一样邪恶。
虽然我并没有太多使用它们的经验,但我在最近的一个项目中使用了它们,这让我得出了这个结论。我遇到的问题是,它们可能导致业务逻辑在两个位置结束,一个代码库和一个数据库。
我认为这与使用scprocs类似。您经常会遇到一些开发人员,他们非常擅长将业务逻辑写入SQL到数据库中,而那些不擅长的人将业务逻辑放在其他地方。
所以我的经验法则是看看你项目的结构是什么。如果在数据库中存储业务逻辑似乎是可行的,那么使用触发器可能是有用的。