/* 分類: 1、DDL觸發器 執行create,alter,drop操作時,會激活的觸發器 2、DML觸發器 執行增、刪除、修改時,激活的觸發器 3、系統事件觸發器 執行特定的系統事件時(啟動、加載、登錄、退出) 構成: 1、觸發事件:會引起觸發器執行的操作;DDL操作,DML操作,系統事件; 2、觸發時間:before ,after, instead of:替代 3、觸發條件:where 條件 4、觸發對象:表、視圖、數據庫對象 5、觸發頻率:語句級別(表級別):執行一次,行級別:for each row :滿足條件的每一行操作都會激活觸發器; 6、觸發操作:觸發器中執行的操作; */ -- 1、語句級別的觸發器。(執行一次) -- before觸發器 和 after觸發器 剛執行語句 觸發器跟着執行(1.判斷語句是否執行 2.不給語句執行的機會) 和 語句可以先執行后設置的事件 -- 理解:當用戶執行某個操作時,會執行我所寫的觸發器 -- oracle中創建一個觸發器 create or replace 關鍵字trigger + 觸發器的名字。 create or replace trigger insertInterceptor after delete on emp -- 定義觸發器的時間種類。 xx xx on xx 表名。 declare v_money emp.sal%type; row1 emp%rowtype; cursor c(no emp.deptno%type) is select * from emp where deptno=no; begin insert into emp (empno,ename,job,sal) values(20,'學習','張三',2000); open c(20); loop fetch c into row1; exit when c%notfound; dbms_output.put_line( 'cursor index=='||c%rowcount|| '姓名=='||row1.ename|| '--------工資=='||row1.sal|| '--------工作=='||row1.job ); end loop; close c; end; -- 測試效果:刪除20后新填入一個20在emp表中 並輸出emp表中對應部門的 相關的 數據 delete from emp where empno=20; --練習 禁止用戶在emp中的刪除數據 tg01 alter trigger tg01 enable; alter trigger tg01 disable; delete from emp where empno=2; -- 禁止用戶在emp中 update數據 create or replace trigger updateMessage before update on emp declare begin raise_application_error(-20010,'禁止用戶在emp中 update數據'); --注意oracle錯誤碼 20000--20999; end; --測試 update emp set ename='哈哈' where empno=7788; alter trigger updateMessage disable; -- 2、行級別觸發器 for each row :滿足條件的每一行操作都會激活觸發器; create or replace trigger rowMessage before update or insert on emp for each row declare begin -- 如果條件執行 就給出相應的提示 if updating then dbms_output.put_line('執行了更新的操作'); if:old.sal>:new.sal then -- 邏輯表 raise_application_error(-20002,'禁止給員工降工資!'); end if; elsif inserting then dbms_output.put_line('執行了錄入的操作'); end if; end; --關閉觸發器 alter trigger updateMessage disable; alter trigger insertInterceptor disable; update emp set sal=sal+1 where deptno=20; commit; insert into emp (empno,ename,sal)values(5,'嘻嘻',500); select * from emp; select sal from emp where deptno=20; -- 刪除觸發器 drop trigger tg02;