SQL:语句触发器 VS 用于每行



>编辑:我不知道它是什么发行版,它在试卷中。

可悲的是,我只是没有得到这个。我对行级别触发器非常满意,但是有人可以向我解释如果触发器是语句级别,结果会有什么不同吗?

关系/语句触发器/行级别触发器

Employee(ID VARCHAR2(30), Salary NUMBER)

Create Trigger AutoRaise
After insert on Employee
Referencing new table as NT
update Employee
Set salary = salary + (select avg(salary) from NT)

Create trigger AutoRaise
After insert on Employee
Referencing new table as NT
For each Row
Update employee
Set salary = salary + (select avg(salary) from NT)

我知道在 for 每一行触发器中,它将为受触发语句影响的每一行触发。现在,语句级别触发器是否会以不同的方式修改结果?假设我在一个语句中插入五个元组,它会为它们设置薪水等吗?如果是这样,此处的行级别触发器有什么好处?

我尝试过搜索,但我就是无法理解它。

谢谢

编辑:现在,我只是密集,但任何一个触发器都会产生不同的输出吗?对于语句级别触发器(如果我使用示例值(:

在创建触发器之前的表中:

(A,50)

创建触发器后添加到一个语句中:

(B,70), (C,30)

第一个触发器肯定会为每个插入的元组设置薪水吗?所以第一个会变成 120(因为平均值是 50,70 + 50 = 120(,第二个会变成 80。如果这是真的,第二个触发器的结果有何不同?

不同之处在于,在语句级别触发器的情况下,SELECT avg(salary) FROM NT将返回插入行的平均工资,但在行级别的情况下,avg(salary)始终等于新记录的salary(为每一行单独执行触发器(。 此外,如果没有受影响的记录,将执行语句级别触发器。在行级别触发器的情况下,大多数 RDMS 不会在 0 条记录受到影响时触发它。

旁注。我认为问题中的触发机构仅举例说明;否则,我建议不要在触发器中使用递归,即使特定的 RDMS 有这样的选项。

最新更新