Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 前触发器能做什么,后触发器能做什么';t,反之亦然_Sql_Triggers_Database Trigger - Fatal编程技术网

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无关,更多的是关于标准。