触发器,事件-条件-动作规则(event-condition-action rule),ECA规则
事件发生,触发器被激活,判断条件,执行动作
create trigger netWorthTrigger
after update of netWorth on movieExec //事件
referencing
old row as oldTuple,
new row as newTuple
for each row
when (oldTuple.netWorth>newTuple.netWorth) //条件
update movieExec //动作
set netWorth=oldTuple.netWorth
where cert#=newTuple.cert#
设置条件检查与动作在触发器事件前还是后执行
after update of netWorth on movieExec
before(条件为假的话动作不执行,事件还是要执行的)
instead of与视图修改有关
of 属性是可选项,insert delete的时候就不能用
条件
when (oldTuple.netWorth>newTuple.netWorth)
可选项,缺省的话,只有触发器被激活就要执行动作
动作
动作可以有多条SQL语句,用begin...end括起来,用分号分隔
动作是针对整个关系的而不是被修改的元组或被修改的元组组成的关系(所以这里要用一个where语句)
update movieExec //动作
set netWorth=oldTuple.netWorth
where cert#=newTuple.cert#
选择动作执行的方式
作为事件的一条SQL语句可能会修改多行,那条件和动作应该被执行多少次呢
1.行级触发器:每改变一个元组触发器就执行一次
for each row
2.语句级触发器:一次针对在数据库操作中被改变的所有元组,即只执行一次(即使SQL语句引起了许多行的改变)
for each statement
默认
referencing
old row as oldTuple,
new row as newTuple
条件和动作可以引用元组的旧值和触发事件中更新的新值
插入的时候没有old row
删除的时候没有new row
old row,new row表示的是修改前的元组和修改后的元组
old table,new table表示的是修改前的元组组成的关系和修改后的元组组成的关系(唤醒触发器的操作涉及的元组)
行级以上两种都可以用
语句级就只能用后面一种
create trigger avgNetWorthTrigger
after update of netWorth on movieExec
referencing
old table as oldStuff
new table as newStuff
for each statement
when(500000>(select avg(netWorth) from movieExec))
begin
delete from movieExec
where (name,address,cert#,netWorth) in newStuff;
insert into movieExec
(select* from oldStuff);
end;
修改期间平均值可以暂时低于500000,但整个修改操作结束后若低于500000就要回到原来的状态
所以本例中是不可以用行级触发器的
before触发器的重要用途是,在插入元组之前以某种方式处理被插入的元组
对new的赋值要在before的情况下执行,因为这个时候new值还没有被更新进去,不能在after的情况下对new赋值只能读取
https://www.cnblogs.com/joyco773/p/5787088.html
create trigger fixYearTrigger
before insert on movies
referenceing
new row as newRow
new table as newStuff
for each row
when newRow.year is null
update newStuff set year=1915
insert语句也是一次可以插入多条元组的
插入一个新元组到movies前,若新插入的元组year分量为null就把它改成1915
描述修改的时候要用到表,但这个时候新数据还没有查到movies里所以不能用movies要用newStuff
疑问:当insert语句插入多条元组的时候,newStuff里不是有多条元组嘛,怎么知道要把哪个元组的year改成1915
难道是因为行级触发器,每插入一条就激活一下,所以newStuff也只是当前插入(唤醒触发器的操作)涉及的元组组成的关系,即只有那条关系
网友评论