Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 行级触发器与语句级触发器_Sql_Database - Fatal编程技术网

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

Sql 行级触发器与语句级触发器,sql,database,Sql,Database,我很难理解“行级触发器”和“语句级触发器”之间的区别 据我所知,在创建语句级触发器的场景中,可以修改整个表。行级触发器只允许修改受触发器指定事件影响的元组 这是正确的吗? 有人举过这两个例子吗?主要区别不是触发器可以修改什么,而是取决于DBMS。触发器(行或语句级)也可以修改相同或其他表的一行或多行*,并可能具有级联效应(触发其他操作/触发器),但所有这些当然都取决于DBMS 主要区别在于触发器被激活的次数。假设您有一个1M行表,并运行: UPDATE t SET columnX = colum

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

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

这是正确的吗?
有人举过这两个例子吗?

主要区别不是触发器可以修改什么,而是取决于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可能会在某些情况下显示“mutating table”错误,例如,当行级触发器从整个表中进行选择时(
SELECT MAX(col)from tablename
),或者如果它修改了其他行或整个表,而不仅仅是与之相关/从中触发的行

当然,行级触发器(在Oracle或其他语言中)修改其更改触发的行是完全有效的,这是一种非常常见的用法。中的示例


其他DBMS可能对任何类型的触发器可以做什么,甚至提供什么类型的触发器都有不同的限制(一些DBMS在触发器之前没有
,例如,一些DBMS根本没有语句级触发器,等等).

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

示例:假设你有一个触发器,可以确保所有高中高年级学生毕业。也就是说,当一个高年级学生的分数是12,我们将其增加到13,我们希望将分数设置为
NULL

对于语句级触发器,您可以说,在运行REGREASE grade语句后,检查整个表一次,以将grade为13的NOW更新为
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;
行级触发器如下所示:

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中,每行的
是可选的。

语句级触发器对于dml语句行只有一次,而对于dml语句,leval触发器对于每行都有一次。。 维塞尔瓦。。。当您希望在每次修改行数时执行语句时,需要使用行级触发器

例如:当表被修改时,语句级触发器工作。然后更多的记录被影响。
行级触发器适用于每次行更新或修改时。

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

语句级触发器:根据名称,如果执行任何语句,它都会工作。 不取决于受影响的行数或任何行数。它只执行一次。 Exp:如果您想更新部门人力资源部每位员工的工资,最后您想知道有多少行生效,意味着有多少行加薪,那么使用语句级触发器。 请注意,即使更新了零行,触发器也会执行,因为如果执行了任何语句,都会调用语句级触发器。不管它是否影响任何行

行级触发器:每次行受影响时执行。如果受影响的行数为零,则不会执行行级触发器。假设您希望从emp表中删除一个部门为HR的员工,并且希望在从emp表中删除员工后,立即将HR部分的部门表中的计数减少1。然后您应选择行级触发器。

1)行级触发器用于对其执行操作作为插入、更新或删除的行集

示例:-您必须删除一组行,同时删除的行也必须插入新表中以进行审核

2) 语句级触发器:-它通常用于对正在执行的事件施加限制

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


希望这有帮助:)

因此,语句级触发器可以修改一行,而行级触发器可以修改表中的每一行?不,行级触发器也可以用于更新/删除/插入多行。或者其他表中的行。还有语句级触发器。我们可以使用不带when子句的行级触发器吗?有人请帮帮我,我不知道你在问什么。