PL/SQL 07 觸發器 trigger

j04212發表於2014-02-12

--觸發器

觸發器有三類:
 資料操作觸發器
    用before觸發器進行資料校驗
    用after觸發器進行級聯操作
    語句觸發器限制資料的操作和記錄操作日誌
    instead of 觸發器(只針對檢視不允許DML操作時)
 資料定義觸發器
    監視資料庫中使用者的一些重要操作
 系統觸發器


--觸發器的限制

不應該使用事務控制語句
COMMIT, ROLLBACK, SAVEPOINT

由觸發器呼叫的任何過程與函式都不能使用事務控制語句

不能宣告任何LONG或LONG RAW變數

可以訪問的表有限

變化表
被DML語句正在修改的表,亦即定義觸發器的表

限制表
有些表在建立的時候就帶有參考完整性限制的宣告
主鍵與外來鍵

觸發器主體中的限制
不可以讀取或修改任何變化表
不可以讀取或修改限制表的主鍵,唯一值列,外來鍵列


--資料操作觸發器

create or replace trigger 觸發器名字
  before/after  insert/update/delete
  on 表名/檢視名
  for each row
declare
  變數定義;
begin
  程式碼;
end;


--for each row為行級觸發器,去掉為語句級觸發器

:new.欄位  資料操作後的內容
:old.欄位  資料操作前的內容


--禁止向t_score表中新增微機原理的成績

create or replace trigger trg_insert_sco
before insert
on t_score
for each row
declare
  coursename t_course.coursename%type;
begin
  select coursename
  into coursename
  from t_course
  where courseno=:new.courseno;
  if coursename='微機原理' then
    raise_application_error(-20001,'該課程已經考試結束,不能新增成績記錄');
  end if;
end;


--當學生表中新增一條記錄時,自動為此學生新增高等數學期中成績,分數設為null

create or replace trigger trg_insert_stu
after insert
on t_student
for each row
begin
  insert into t_score
  values(:new.stuno,'期中',(select courseno
                            from t_course
                            where coursename='高等資料'),null);
end;
     
--語句觸發器
--禁止8:00到18:00對成績表進行操作

create or replace trigger trg_ope_sco
before insert or update or delete
on t_score
begin
  if (to_char(sysdate,'hh24:mi') not between '8:00' and '18:00')
    then
    raise_application_error(-20004,'不能再非工作時間對t_score表進行操作');
  end if;
end;


--instead of 觸發器
--對於含有連線或子查詢的檢視,一般無法進行DML操作,可以用instead of 觸發器實現

create or replace trigger 觸發器名字
instead of insert/update/delete
on 檢視名
for each row
declare
  變數定義;
begin
  程式碼;
end;

create or replace trigger trg_update_vw_cou_tea
instead of update
on vw_cou_tea
for each row
declare
  tno t_teacher.teano%type;
begin
  select teano
  into tno
  from t_teacher
  where teaname=:new.teaname;
  update t_course
  set teano=tno
  where coursename=:old.coursename;
end;  


--資料定義語言觸發器

create or replace trigger 觸發器名字
before/after 使用者事件
on database|schema
   declare
  變數定義;
begin
  程式碼;
end;


--使用者事件包括create、alter、drop、使用者登入login等

--禁止使用者刪除資料庫物件 

create or replace trigger trg_drop
before drop
on schema
begin
  raise_application_error(-20005,'不能刪除'); 
end;
 
--觸發器(OEM)

create trigger bmbtrigger
before insert or update or delete
on bmb
begin
if(to_char(sysdate,'DAY'))='SUN'
then
RAISE_APPLICATION_ERROR(-20600,'you can not update table on weekend.');
end if;
end;


create or replace trigger gzbtrigger
after insert or update or delete
on gzb
declare suminconme number
begin
select sum(income) into sumincome from gzb;
if sumincome<50000
  then
  raise_application_error(-20001,'收入低於2萬');
end if;
end;

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27633655/viewspace-1080404/,如需轉載,請註明出處,否則將追究法律責任。

相關文章