我很难理解'行级触发器'和'语句级触发器'之间的区别。
根据我的理解,在场景中创建一个语句级触发器,可以修改整个表。行级触发器只允许我修改受触发器特定事件影响的元组。
这是对的吗? 有没有人有两个例子?
谢谢!
答案 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语句的每一行,leval触发器是针对dml语句的每一行
答案 4 :(得分:0)
如果要在修改行数时执行该语句,则可以通过语句级触发器来执行该语句。 viseversa ...当你想要执行你的语句每行修改你的行数时,你需要去行级触发器..
例如:语句级触发器适用于修改表的时间..然后实现更多的记录。 和行级触发器适用于每行更新或修改时..
答案 5 :(得分:0)
1)行级触发器用于对行集执行操作,如插入,更新或删除
示例:-您必须删除一组行,同时出于审计目的,已删除的行也必须插入新表中;
2)陈述级别触发器:-通常用于对您正在执行的事件施加限制。
示例:-限制在晚上10点至早上6点之间删除数据;
希望这会有所帮助:)