PLSQL學習-【8trigger】

哎呀我的天吶發表於2014-11-24



觸發器在資料庫裡以獨立的物件儲存,它與儲存過程不同的是,儲存過程透過其他程式來啟動執行或者直接啟動執行,而觸發器是由一個時間來啟動執行。並且,觸發器不能接受引數。所以執行觸發器就叫觸發或者點火。
ORACLE事件指的是對資料庫的表進行的insert、update、delete操作或者對檢視進行類似的操作。
ORACLE將觸發器的功能擴充套件到了觸發ORACLE,如資料庫的啟動與關閉等。


語句級觸發器: 是指當某觸發事件發生時,該觸發器只執行一次;
行級觸發器: 是指當某觸發事件發生時,對受到該操作影響的每一行資料,觸發器都單獨執行一次。
old 代表舊資料,new代表修改或插入的新資料。
所以insert只有new delete只有old


在刪除動作之前備份。


03:27:31 SQL> create table emp_bak as select * from emp where 1 = 2;
Table created.
Elapsed: 00:00:00.06
03:29:13 SQL> 
03:29:13 SQL> select * from emp_bak;
no rows selected



create or replace trigger br_bak
  before delete or update on emp for each row 
  declare
  begin
    insert into emp_bak 
    values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,old.sal,old.comm,old.deptno);
  commit;
end;


這裡不能用commit,以為觸發器本身就是一個事務,刪除和備份看成一個整體,刪除成功必須保障備份成功。
create or replace trigger br_bak
  before delete or update on emp for each row   --針對行的觸發
  declare
begin
    insert into emp_bak 
    values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
end;


03:29:27 SQL> delete from emp where empno = 9999;
1 row deleted.
Elapsed: 00:00:00.04
03:31:33 SQL> commit;
Commit complete.
Elapsed: 00:00:00.00
03:31:36 SQL> select * from emp_bak; 
     EMPNO ENAME      JOB           MGR HIREDATE           SAL     COMM      DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
      9999 LOU
Elapsed: 00:00:00.07
這樣就可以了。

替換觸發器:
create or replace trigger tr_delete
   instead of delete on emp_back for each row 
   declare 
begin
   delete from emp where empno=:old.empno; 
end;


記錄使用者的操作行為:
   
語句觸發:

create or replace trigger tr_action 
  after insert or delete or update on emp 
  declare
    v_action varchar2(30);
  begin
    if inserting then
     v_action:='insert';
    elsif deleting then
    v_action:='delete';
    elsif updating then
     v_action:='update';
    else 
     v_action:='others';
    end if;
    insert into t_action values(v_action ,sysdate);
end;


當對emp中記錄進行操作的時候,我們就會在這個表中有記錄。

04:32:48 SQL> select * from t_action;
ACTION_NAME                     ACTION_TIME
------------------------------ ------------
delete                          24-NOV-14
Elapsed: 00:00:00.00

系統觸發器 :記錄哪些使用者偷偷的登陸你的資料庫了

04:46:32 SQL> r
  1 create or replace trigger tr_login
  2    after logon on database
  3    declare
  4 begin
  5    insert into scott.login_tab values(USER,sysdate);
  6*end;
Trigger created.


去login_tab表中檢視記錄。





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

相關文章