gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:37:57 25 4
gpt4 key购买 nike

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

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

这是正确的吗?有没有人有这两者的例子?

最佳答案

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

关于sql - 行级触发器与语句级触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10167346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com