sql-行级触发器与语句级trigg

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

据我了解,在创建语句级别触发器的情况下,可以修改整个表。 行级触发器只会允许我修改受触发器的特定事件影响的元组。

它是否正确?有人举两个例子吗?

谢谢!

Gregorio Di Stefano asked 2020-02-21T22:25:41Z
6个解决方案
75 votes

主要区别在于触发器无法修改的内容取决于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可能会显示“变异表”错误。 当从整个表中选择行级触发器(BEFORE)或修改其他行或整个表时,不仅是与/触发相关的行。

当然,对于行级触发器(在Oracle或其他系统中)修改其更改已触发它的行,这是非常普遍的用法,这是完全有效的。 dbfiddle.uk中的示例。

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

ypercubeᵀᴹ answered 2020-02-21T22:26:36Z
19 votes

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

示例:假设您有一个触发器,可以确保所有高中毕业生毕业。 也就是说,当高年级为12,并且我们将其提高到13时,我们希望将年级设置为FOR EACH ROW

对于语句级别的触发器,您可能会说,在运行grade-grade语句后,请检查整个表一次以将所有级别为13的即时更新为FOR EACH ROW

对于行级触发器,您会说,每更新一行后,如果新行的等级为13,则将其等级更新为FOR EACH ROW

语句级触发器如下所示:

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是可选的。

Rose Perrone answered 2020-02-21T22:27:24Z
1 votes

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

语句级别触发器:基于名称,如果执行了任何语句,它将起作用。不依赖于影响多少行或任何行,它仅执行一次。Exp:如果您想更新部门HR中每位员工的薪水,最后您想知道影响了多少行意味着增加了多少薪水,请使用语句级别触发器。请注意,即使更新了零行,触发器也会执行,因为它是语句级别的触发器,如果执行了任何语句,则将调用该触发器。 不管是否影响任何行都无关紧要。

行级触发器:每次影响一行时执行。 如果受影响的行数为零,则不会执行行级别的触发器。假设您要从emp表中删除一个部门是HR的雇员,并且想要从emp表中删除雇员后,将HR部分的dept表中的计数减少 1.然后您应该选择行级触发器。

pinaki answered 2020-02-21T22:27:54Z
0 votes

语句级触发器仅对dml语句行一次,而水平触发器仅对dml语句的每一行

A rajasekhar answered 2020-02-21T22:28:14Z
0 votes

如果要在修改行数时执行该语句,则可以通过语句级触发器来执行。viseversa ...当您要执行语句时,对行数进行每次修改,则需要使用行级触发器。

例如:语句级触发器适用于修改表的情况。然后,会影响更多数量的记录。行级触发器适用于每次更新或修改行时的情况。

ananth answered 2020-02-21T22:28:39Z
0 votes

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

例如:-您必须删除一组行,同时为了审计目的,已删除的行也必须插入新表中;

2)陈述层级触发:-通常用于对您正在执行的事件施加限制。

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

希望这可以帮助:)

Sajal Agarwal answered 2020-02-21T22:29:17Z
translate from https://stackoverflow.com:/questions/10167346/row-level-trigger-vs-statement-level-trigger