触发器就是一段程序,会在条件满足时执行

基本语法


CREATE TRIGGER trigger_name //触发器名字

 BEFORE | AFTER { INSERT | DELETE | UPDATE [OF colname {, colname...}] }//条件检查时机
ON tablename [REFERENCING corr_name_def {, corr_name_def...} ]//作用哪张表、哪些列
[FOR EACH ROW | FOR EACH STATEMENT]
//对更新操作的每一条结果(前者),或整个更新操作完成(后者)
[WHEN (search_condition)] //检查条件,如满足执行下述程序
{ statement //单行程序直接书写,多行程序要用下行方式
| BEGIN ATOMIC statement; { statement;...} END }

例1

设计一个触发器当进行Teacher表更新元组时, 使其工资只能升不能降

create trigger teacher_chgsal before update of salary//条件检查时机
on teacher//作用域
referencing new x, old y//给更新前/后的该条数据分别命名
for each row when (x.salary < y.salary)
begin
raise_application_error(-20003, 'invalid salary on update');
//此条语句为Oracle的错误处理函数
end;//begin与end之间的为执行的动作

注意:for each row语句。因为数据库的更新可能不止涉及一行,所以需要加上这句

例2

假设student(S#, Sname, SumCourse), SumCourse为该同学已学习课程的门数,初始值为0,以后每选修一门都要对其增1 。设计一个触发器自动完成上述功能。

create trigger sumc after insert on sc
referencing new row newi
for each row
begin
update student set SumCourse = SumCourse + 1
where S# = :newi.S# ;
end;

例3

假设student(S#, Sname, Sage, Ssex, Sclass)中某一学生要变更其主码S#的值,如使其原来的98030101变更为99030131, 此时sc表中该同学已选课记录的S#也需自动随其改变。设计一个触发器完成上述功能