行级触发器与语句级触发器

时间:2012-04-16 00:15:46

标签: sql database

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

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

这是对的吗? 有没有人有两个例子?

谢谢!

6 个答案:

答案 0 :(得分:75)

主要区别不在于触发器可以修改的内容,这取决于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触发器,有些触发器根本没有语句级触发器等等)。

答案 1 :(得分:17)

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

示例:假设你有一个触发器可以确保所有高中毕业生都能毕业。也就是说,当一个大四的成绩为12,我们将其提高到13时,我们希望将成绩设为NULL

对于语句级别触发器,您可以说,在增加等级语句运行后,检查整个表格一次,将等级为13的任何内容更新为NULL

对于行级触发器,您可以说,在更新的每一行之后,如果它是13,则将新行的成绩更新为NULL

语句级触发器如下所示:

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

答案 2 :(得分:1)

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

语句级别触发器:基于名称,如果执行任何语句,它将起作用。 不取决于影响的行数或行数。它只执行一次。 Exp:如果你想更新部门HR中每个员工的薪水,最后你想知道有多少行受影响意味着有多少工资增加了,那么使用声明级触发器。 请注意,即使零行已更新,触发器也会执行,因为如果已执行任何语句,则会调用语句级触发器。无论是否影响任何行都无关紧要。

行级触发器:每次受影响时执行。如果零行受影响。如果你想从emp表中删除一个就业表,那么行级别触发器将执行。如果你想从emp表中删除员工,那么一旦员工从HR表中删除,那么从HR部分删除dept表中的计数应该减少1.然后你应该选择行级触发器。

答案 3 :(得分:0)

对于dml语句,

语句级别触发器只有一次对于dml语句的每一行,leval触发器是针对dml语句的每一行

答案 4 :(得分:0)

如果要在修改行数时执行该语句,则可以通过语句级触发器来执行该语句。 viseversa ...当你想要执行你的语句每行修改你的行数时,你需要去行级触发器..

例如:语句级触发器适用于修改表的时间..然后实现更多的记录。 和行级触发器适用于每行更新或修改时..

答案 5 :(得分:0)

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

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

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

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

希望这会有所帮助:)