plsql 觸發器介紹 語句級別觸發器、行級別觸發器。


/*
分類:
    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;

 

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM