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

Gre*_*ano 47 sql database

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

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

它是否正确?有没有人有这两个例子?

谢谢!

ype*_*eᵀᴹ 75

主要区别不在于触发器可以修改的内容,这取决于DBMS.触发器(行或语句级别)也可以修改相同或其他表的一行或多行,并且可能具有级联效果(触发其他动作/触发器),但所有这些当然取决于DBMS.

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

UPDATE t
SET columnX = columnX + 1
Run Code Online (Sandbox Code Playgroud)

语句级触发器将被激活一次(即使没有更新行也是如此).行级触发器将被激活一百万次,每次更新一行一次.


另一个区别是订单或激活.例如,在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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • 不,行级触发器也可用于更新/删除/插入许多行.或其他表中的行. (2认同)

Ros*_*one 19

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

例子:假设你有一个触发器可以确保所有高中毕业生都能毕业.也就是说,当一个大四的等级是12,并且我们将它增加到13时,我们想要将等级设置为NULL.

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

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

语句级触发器如下所示:

create trigger stmt_level_trigger
after update on Highschooler
begin
    update Highschooler
    set grade = NULL
    where grade = 13;
end;
Run Code Online (Sandbox Code Playgroud)

行级触发器如下所示:

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;
Run Code Online (Sandbox Code Playgroud)

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