Sql 前触发器能做什么,后触发器能做什么';t,反之亦然
我已经读了很多关于这类触发器的书,直到现在我所理解的是,它们可以做完全相同的事情,区别更多的是“味道”,而不是它们真正能够做什么Sql 前触发器能做什么,后触发器能做什么';t,反之亦然,sql,triggers,database-trigger,Sql,Triggers,Database Trigger,我已经读了很多关于这类触发器的书,直到现在我所理解的是,它们可以做完全相同的事情,区别更多的是“味道”,而不是它们真正能够做什么 所以我要问的是:是否有什么东西是前触发和后触发相比不能做的,反之亦然?我遗漏了什么吗?before触发器允许您在执行任何其他操作之前设置操作 假设一个表中有一个外键列,它不能为null。您可以在插入需要设置此FK的行之前插入该行 您可以禁止任何操作(不允许更改键表…) 您可以检查是否存在,并执行更新而不是插入 还有更多…要对@Shnugo的答案进行一点扩展,请注意,我
所以我要问的是:是否有什么东西是前触发和后触发相比不能做的,反之亦然?我遗漏了什么吗?before触发器允许您在执行任何其他操作之前设置操作 假设一个表中有一个外键列,它不能为null。您可以在插入需要设置此FK的行之前插入该行 您可以禁止任何操作(不允许更改键表…) 您可以检查是否存在,并执行更新而不是插入
还有更多…要对@Shnugo的答案进行一点扩展,请注意,我的评论更具体地针对sql server,但我相信这些原则适用于具有触发器的其他rdbms 在之前(或代替)可以做什么之后不能做的事 假设您在一个空白表上有一个
BEFORE
触发器,该表的标识列不执行任何插入操作。要在之后的触发器中获得类似的结果,您必须删除插入的记录
让我们浏览一下使用不同触发器插入记录的过程。如果启用了
触发器之前的,并且您执行了100次插入,但触发器实际上没有插入它们,那么您将禁用触发器并执行一次插入,您将处于标识1
对AFTER
触发器和插入AFTER时执行相同的操作,此时将处于101。因为实际插入的记录,但随后被删除
因此,之前
触发器可以完全停止操作,而之后的触发器必须尝试撤消操作以在数据中获得类似的结果。复杂验证?或者在Shnugo的示例中,更常见的是在将子项插入父项之前插入父项记录,这样就不会发生外键约束错误
在
触发器之后的可以做什么,而在
之前的不能做什么
在insert语句中使用标识列。在sql server中,在上述触发器之前的同一个中插入的特殊表将返回Identity=0
,而不是Identity=1
。其中之后的触发器将具有标识=1
。因此,在BEFORE
中,您可以通过插入父项来避免外键约束,而在BEFORE
中,您可以使用正确的外键插入子记录。我怀疑这是Oracle这主要取决于DBMS,它们可能有不同的限制。我只是研究sql,所以它与任何特定的DBMS无关,更多的是关于标准。