56

我很难理解“行级触发器”和“语句级触发器”之间的区别。

据我了解,在创建语句级触发器的场景中,可以修改整个表。行级触发器只允许我修改受触发器指定事件影响的元组。

这个对吗?有人有这两者的例子吗?

4

6 回答 6

81

主要区别不是触发器可以修改什么,这取决于 DBMS。触发器(行或语句级别)可能会修改相同或其他表的一行或多行*,并且可能具有级联效果(触发其他操作/触发器),但所有这些当然取决于 DBMS。

主要区别在于触发器被激活的次数。想象一下,你有一个 1M 行的表,你运行:

UPDATE t
SET columnX = columnX + 1

语句级触发器将被激活一次(即使没有更新行)。行级触发器将被激活一百万次,每更新一个行一次


另一个区别是顺序或激活。例如,在 Oracle 中,4 种不同类型的触发器将按以下顺序激活:

Before the triggering statement executes
Before each row that the triggering statement affects
After each row that the triggering statement affects
After the triggering statement executes

在前面的例子中,我们会有类似的东西:

Before statement-level trigger executes

  Before row-level trigger executes
  One row is updated
  After row-level trigger executes

  Before row-level trigger executes
  Second row is updated
  After row-level trigger executes

  ...

  Before row-level trigger executes
  Millionth row is updated
  After row-level trigger executes

After statement-level trigger executes

附录

*关于触发器可以修改哪些行:不同的DBMS对此有不同的限制,这取决于DBMS中的具体实现或触发器。例如,Oracle 可能会在某些情况下显示“变异表”错误,例如,当行级触发器从整个表中选择 ( SELECT MAX(col) FROM tablename) 时,或者如果它修改其他行或整个表,而不仅仅是与 / 相关的行从触发。

当然,对于行级触发器(在 Oracle 或其他中)来说,修改其更改已触发它的行是完全有效的,这是一种非常常见的用途。dbfiddle.uk中的示例。

其他 DBMS 可能对任何类型的触发器可以做什么甚至提供什么类型的触发器有不同的限制(BEFORE例如,有些没有触发器,有些根本没有语句级触发器等)。

于 2012-04-16T00:21:15.773 回答
24

您可能希望在客户端执行修改一百万行的语句后执行一次触发器操作(语句级触发器)。或者,您可能希望为修改的每一行触发一次操作(行级触发器)。

示例:假设您有一个触发器可以确保所有高中生毕业。也就是说,当一个大四的成绩是 12,我们把它提高到 13,我们想把成绩设置为NULL

对于语句级触发器,您会说,在 increase-grade 语句运行后,检查整个表一次以将所有等级为 13 的 nows 更新为NULL.

对于行级触发器,您会说,在更新每一行之后,将新行的等级更新NULL为 13。

语句级触发器如下所示:

create trigger stmt_level_trigger
after update on Highschooler
begin
    update Highschooler
    set grade = NULL
    where grade = 13;
end;

行级触发器如下所示:

create trigger row_level_trigger
after update on Highschooler
for each row
when New.grade = 13
begin
    update Highschooler
    set grade = NULL
    where New.ID = Highschooler.ID;
end;

请注意,SQLite 不支持语句级触发器,因此在 SQLite 中,FOR EACH ROW是可选的。

于 2012-08-07T22:57:33.943 回答
4

1) 行级触发器用于对一组行执行操作,如插入、更新或删除

示例:-您必须删除一组行,同时删除的行也必须插入新表以进行审计;

2)语句级触发器:- 它通常用于对您正在执行的事件施加限制。

例如:- 限制在晚上 10 点到早上 6 点之间删除数据;

希望这可以帮助:)

于 2019-04-17T16:55:32.510 回答
3

语句级触发器的主要区别如下:

语句级触发器:根据名称,如果执行任何语句,它就会起作用。不取决于影响的行数或任何行。它只执行一次。Exp :如果您想从部门 HR 更新每个员工的薪水,最后您想知道有多少行生效意味着有多少行增加了薪水,则使用语句级触发器。请注意,即使更新了零行,触发器也会执行,因为它是语句级触发器,如果​​已执行任何语句,则会调用它。不管它是否影响任何行。

行级触发器:每次影响行时执行。如果零行受影响。没有行级触发器将执行。假设如果您想从部门为 HR 的 emp 表中删除一个雇员,并且您希望一旦从 emp 表中删除员工,则 HR 部分的部门表中的计数应减少1.那么你应该选择行级触发器。

于 2014-05-27T06:00:43.610 回答
1

语句级触发器对于 dml 语句只有一次 行级触发器对于 dml 语句的每一行

于 2013-01-25T04:02:52.293 回答
0

如果您想在修改行数时执行该语句,那么可以通过语句级触发器来实现.. viseversa ...当您想要执行您的语句时,每次修改您的行数,那么您需要进入行级别触发..

例如:语句级触发器适用于修改表时..然后影响更多记录。并且行级触发器适用于每行更新或修改时..

于 2013-05-16T10:42:36.210 回答