BEFORE 触发器可以做什么而 AFTER 触发器不能,反之亦然

What a BEFORE trigger can do that an AFTER trigger can't and conversely

我已经阅读了很多有关此类触发器的文章,到目前为止我所了解的是它们可以做完全相同的事情,区别更多的是 "taste" 而不是它们真正能够做的事情.

所以我要问的是:与 AFTER 触发器相比,BEFORE 触发器是否有不能做的事情,反之亦然?我错过了什么吗?

before 触发器允许您在任何其他操作完成之前设置操作。

想象一下 table 具有不可为空的外键列。您可以在 插入需要设置此 FK 的行之前 插入此依赖行。

您可以完全禁止任何操作(不允许更改键 tables...)

您可以检查是否存在并执行更新而不是插入

还有更多...

为了扩展@Shnugo 的回答,请注意我的评论更具体地针对 sql-server,但我相信原则适用于其他具有触发器的 rdbms。

BEFORE 可以做什么 AFTER 不能

假设您在空白 table 上有一个 BEFORE 触发器,其标识列执行 nothing/no 插入。要在 AFTER 触发器中获得类似的结果,您必须删除插入的记录。

让我们来看看如何使用不同的触发器插入记录。如果启用了 BEFORE 触发器并且您执行了 100 次插入,但触发器实际上并未插入它们,那么您禁用触发器并执行插入操作,您将处于标识 1。

AFTER 触发器做同样的事情,当你在之后插入时,你将在 101。因为实际插入的记录,但随后被删除。

因此 BEFORE 触发器可以完全停止操作,而 AFTER 必须尝试撤消操作才能在数据中获得类似的结果。复杂的验证?或者在 Shnugo 的示例中,更常见的是在将子记录插入父记录之前插入父记录,这样就不会发生外键约束错误。

AFTER 触发器可以做什么而 BEFORE 不能。

在插入语句中使用标识列。在 sql-server 中,与上面相同的 BEFORE 触发器中的特殊 table inserted 将 return Identity = 0 而不是 Identity = 1AFTER 触发器将具有 Identity = 1。因此,在 BEFORE 中,您可以通过插入父项来避免外键约束,而在 AFTER 中,您可以执行相反的操作,您可以使用正确的外键插入子记录。