1. 程式人生 > >PL/SQL 觸發器

PL/SQL 觸發器

1觸發器
 本質上:也是一個儲存過程
1、儲存過程可以帶引數,觸發器沒有。
2、儲存過程可以主動呼叫,觸發器不能呼叫


分類1 DML觸發器 insert 
      DDL觸發器 create alter drop
      系統觸發器(啟動、停止、登入、退出)


分類2 事前觸發器 before 事後觸發器after




分類3 行級觸發器 語句級觸發器


偽記錄(幻表):new old  偽記錄
  insert 有new幻表 沒有old幻表


  update 有new幻表 有old幻表


  delete 沒有new幻表 有old幻表 


  before insert or update or delete
on busi_td_cart  
for each row  --行級觸發器
declare
  -- local variables here
begin
   --dbms_output.put_line('觸發器開始啦!');
--raise_application_error(-20001,'我會往外面拋一個異常');
if inserting then
--因為insert 操作而觸發
update Cart_Count t set t.insert_c = t.insert_c+1;
dbms_output.put_line('新插入的記錄有:'||:new.id);
elsif updating then
--因為update 操作而觸發
 update Cart_Count t set t.update_c = t.update_c+1;
dbms_output.put_line('老記錄:'||:old.id||'新記錄:'||:new.id);
elsif deleting then
--因為delete操作而觸發
update Cart_Count t set t.delete_c = t.delete_c+1;
dbms_output.put_line('被刪除的記錄有:'||:old.id);
end if;
end;




2條件謂詞:inserting updating deleting


注意:
   觸發器不允許重複監聽
觸發器的打斷效果


/*
針對UserInfo表所有的觸發器,
事前觸發器
語句級觸發器
*/


create or replace trigger UserInfo_B_IDU
  before insert or update or delete
on busi_td_cart  
for each row  --行級觸發器
declare
  -- local variables here
begin
   dbms_output.put_line('觸發器開始啦!');
raise_application_error(-20001,'我會往外面拋一個異常');
end;






3  觸發器的編譯過程


編譯 ——》編譯成功——》執行事前觸發器——》資料增刪改——》執行事後觸發器




 raise_application_error(錯誤編號,錯誤資訊);
錯誤編號:寫負數,寫2000以後
錯誤資訊:寫字串




可以分開寫觸發器,監聽三種不同的操作;
也可以寫成一個觸發器,通過判斷不同的謂詞來區分。




觸發器和引發觸發器執行的增刪改行為 在同一個事務內  觸發器內部不允許寫commit或者rollback;
觸發器不允許操作本表






4  什麼時候沒有幻表?
只有增刪改的行級觸發器 才有幻表




5   DDL觸發器
create or replace trigger Global
  after  ddl
on LYJ.schema
declare
 
begin
--ora.sysevent() 記錄操作
--ora_dict_obj_type() 記錄型別
--org_dict_obj_name() 記錄名字
--org_login_user() 記錄登入的賬號
   dbms_output.put_line('執行的操作'||ora_sysevent());
dbms_output.put_line('記錄型別'||ora_dict_obj_type());
dbms_output.put_line('記錄名字'||ora_dict_obj_name());
dbms_output.put_line('記錄登入的賬號'||ora_login_user());
end Global;
 




create or replace trigger trg_dbs_01
    --after startup 服務開啟
--before  shutdown 服務關閉
--after logon 登入成功
before logoff --退出登入
on database  
  
declare
  -- local variables here
begin
--用一張表的記錄記錄退出記錄
  null;
end ;




6 管理觸發器
    觸發器狀態:有效(啟用 禁用) 無效


禁止: alter trriger 觸發器名字 disable;
啟用: alter trriger 觸發器名字  enable;
全體禁止: alter table 表 disable all trrigers;
全體啟用:  alter table 表 enable all enable;


自動失效:修改觸發器監聽的表的結構
生效:重新編譯觸發器
     1、手工操作:找到觸發器  右鍵  Recompile
     2、程式碼實現:alter trigger 名字 compile;


刪除: drop trigger 名






大型軟體系統 用得少 效能
級聯觸發器


最大32級級聯效果 效能下降非常嚴重


效能表現:1索引 
         2顯示遊標 (相當於一個容器物件)
         3觸發器