1. 程式人生 > >oracle觸發器簡介與使用方法

oracle觸發器簡介與使用方法

一,觸發器簡介

    觸發器的定義就是說某個條件成立的時候,觸發器裡面所定義的語句就會被自動的執行。因此觸發器不需要人為的去呼叫,也不能呼叫。然後,觸發器的觸發條件其實在你定義的時候就已經設定好了。

二,觸發器的作用

             * 對資料庫的操作進行審計,儲存歷史資料
             *完成資料庫初始化處理
             *控制資料庫的資料完整性
             *進行相關資料的修改
             *完成資料複製
             *自動完成資料庫統計計算

             *限制資料庫操作的時間、許可權等,控制實體的安全

三,觸發器的組成

             1、觸發時間:觸發器事件的時間次序(before, afer)[2]
             2、觸發事件:什麼SQL語句會引起觸發器觸發(Insert, delete, update)[3]
             3、觸發子體:觸發器觸發時要執行的操作(一個完整的PL/SQL程式)
             4、觸發型別:觸發器被執行的次數(語句級、行級)[2] //語句級只執行一次,行級會執行多次。
                          [*]一個表上最多可以建立12個不同型別的觸發器:3*2*2 = 12

四,觸發器語法

create [or replace] tigger 觸發器名 觸發時間 觸發事件
on 表名
[for each row]
begin
 pl/sql語句
end

    觸發器名:觸發器物件的名稱。由於觸發器是資料庫自動執行的,因此該名稱只是一個名稱,沒有實質的用途。
    觸發時間:指明觸發器何時執行,該值可取:
    before:表示在資料庫動作之前觸發器執行;
    after:表示在資料庫動作之後觸發器執行。
    觸發事件:指明哪些資料庫動作會觸發此觸發器:
    insert:資料庫插入會觸發此觸發器;
    update:資料庫修改會觸發此觸發器;
    delete:資料庫刪除會觸發此觸發器。
    表 名:資料庫觸發器所在的表。
    for each row:對錶的每一行觸發器執行一次。如果沒有這一選項,則只對整個表執行一次。

五,示例

   1) 實現當操縱員工表時自動將員工人數統計到部門表中:

    部門表下有三個欄位,分別是部門編碼,部門名稱,總人數

create table dept1(dno int,dname varchar(20),population int);

    員工表下有三個欄位,分別是員工編碼,員工名稱,部門編碼

create table emp1(eid int,ename varchar2(20),dno int);

    編寫觸發器

SQL> create or replace trigger trigger01
   after delete or insert or update on emp1
    for each row
    begin
    if inserting then                                 
    update dept1 set population=population+1     
     where dept1.dno=:new.dno;
    elsif deleting then
    update dept1 set population=population-1
  where dept1.dno=:old.dno;
   elsif updating then
   update dept1 set population=population+1
   where dept1.dno=:new.dno;
  update dept1 set population=population-1 
  where dept1.dno=:old.dno;
   end if;
   end;
/
((特殊變數:   :new    :old
   :new代表你所新輸入的資料
   :old代表更改前的資料
  使用方式 :old.列名
  insert 操作只有 :new
  delete 操作只有 :old

  update 操作 :new  :old 都有)

2)使用觸發器實現序號自增

    建立一個序列

create sequence SEQ_TEST
minvalue 1        --最小值
nomaxvalue        --不設定最大值
start with 1      --從1開始計數
increment by 1    --每次加1個
nocycle           --一直累加,不迴圈
nocache;          --不建緩衝區

 建立測試表

create table TEST
(
  NID int PRIMARY KEY,
  test1 varchar2(20)
);

建立觸發器

CREATE OR REPLACE TRIGGER tg_test
BEFORE INSERT ON test 
FOR EACH ROW WHEN (new.nid is null)
begin
select seq_test.nextval into:new.nid from dual;
end;
/

插入幾條資料驗證下吧

select * from test;
insert into test(nid,test1) values(4,'aaa'); --手動插入序號
insert into test(test1) values('bbb');       --自動插入序

博主還寫過使用觸發器配置oracle使用者登入資訊日誌功能,可以直接複製在生產庫使用,詳情請點選以下連結

https://blog.csdn.net/zcb_data/article/details/80497414 點選開啟連結