【データベースベース】データベース整合性制御-トリガ

6519 ワード

本文はMOOC哈工大データベースの原理に由来するすべての例はDBMSテストで間違いを報告する可能性があるが、これはブロガーの個人ノートにすぎない.
トリガはデータベースの整合性を制御する中で、データベースの整合性の制約条件intergrity constraint(O,P,A,R)をよく表現することができる.静的制約データベースの整合性とは異なります.AR都時デフォルトです.

トリガの基本構文の定義

create triggle triggle_name before|after
{inset|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;
}

corr_name_defの構文
{
old [row] [as] old_row_name_def
new [row] [as] new_row_name_def
old [table] [as] old_table_name_def
old [table] [as] old_table_name_def
}

eg:Teacher表では、給料は上昇するしか下がらない.
create triggle TeaSla before
update of salary 
on Teacher referencing old x new y
for each row
when(x.salary>y.salary){
    begin 
    raise_application_error(-20003,"invalid salary on update);
    end;
}

eg:student(S#,Sname,sumCourse)は、sumCourseがその同級生が選択した課程であり、初期値は0であり、同級生に選択していない課程を与えると、sumCourseの値が1つ加算される.
create triggle stuSumCourse after
insert on Sc
referencing new row newi
begin
update sumCourse=sumCourse+1
where S#=:newi.S#;
end;

eg:studentテーブルの学生はS#を変更し、Scテーブルの対応するS#も変更する
create triggle upSno after
update of S# on student
referencing old oldi new new i
for each row
begin
update Sc set S#=newi.S# where S#=:oldi.S#;
end;

eg:studentテーブルからS#を削除し、その学生のすべての選択成績を削除します.
create triggle delesno after 
delete of S# on student
referencing old oldi 
for each row
begin
delete from Sc where S#=:oldi.S#;
end;

eg:studentテーブルでS#を削除すると、その学号に対応する選択成績が空になります.
create triggle setnull after
delete of S# on student
referencing old oldi
for each row
begin
update Sc
set S#=NULL where S#=:oldi.S#;
end;

eg:Dept(D#,Dname,Dean) ,Teacher(T#,Tname,D#,salary);Deanがこの学部の教師の給料が最も高い先生であれば、トリガを設計して実現してください.
create triggle upsala before
update of Dean on Dept
referencing of new newi
for each row
when(Dean not in (select Tname from Teacher where D#=:newi.D#) and salary >= all(select salary from Teacher where D#=:newi.D#)){
    bengin
    raise_application_error(-20003,"invalid Dean on update");
    end;
}

未完~