前言:通過本次學習您可以學到什麼
目錄:
一、什麼是觸發器。
二、觸發器的應用情境是什麼。
1、複雜的安全性檢查
2、資料的確認
3、實現審計功能
4、完成資料的備份和同步
三、觸發器的文法是什麼。
四、觸發器的類型有哪些。
1、語句級的觸發器
2、行級的觸發器
五、案例介紹
----------------------------------------------------------------------------------------------
一、什麼是觸發器。
每當一個特定的資料動作陳述式(insert、update、delete)在指定的表上發出時,Oracle自動地執行觸發器中定義的語句序列。
注意select語句不在上述的操作範圍內。
第一個觸發器:每當成功插入新員工資訊後,自動列印“成功插入新員工”。
如何建立觸發器
create trigger savenewemp
after insert
on emp
declare
begin
dbms_output.put_line( '成功插入新員工' );
end;
/
這個oracle中的觸發器就非常類似於我們熟悉的java中的監聽器。
二、觸發器的應用情境是什麼。
1、複雜的安全性檢查
當我們需要安全性策略的時候,比如周末禁止操作資料庫等。
2、資料的確認
比如我們漲工資的時候,如果工資變少了,就可以用觸發器進行確認。
3、實現審計功能
跟蹤表上所做的資料操作,目前也在oracle中單獨實現,也可以用觸發器實現,這種審計叫做基於值的審計。
4、完成資料的備份和同步
三、觸發器的文法是什麼。
上面我們漏提到了一句文法:[For each row[when(條件)]]
首先我們需要先瞭解觸發器的類型,如果有上面這句[For each row[when(條件)]]的話,那他就是行級觸發器。
四、觸發器的類型有哪些。
語句級觸發器:在指定的動作陳述式操作之前或者之後執行一次,不管這條語句影響了多少行。
針對的是表。
行級觸發器:觸發語句作用的每一條記錄都被觸發,在行級觸發器中我們使用:old和:new偽記錄變數,識別值得狀態。
針對的是行。
五、觸發器的應用情境
1、複雜的安全性檢查
實施複雜的安全性檢查:禁止在非工作時間插入新員工。
/*
1、周末:to_char(sysdate,'day') in ('星期六','星期日')
2、上班前(9),下班後(18):to_number(to_char(sysdate,'hh24')) not between 9 and 18
*/
create or replace trigger securityemp
before insert
on emp
declare
begin
if to_char(sysdate,'day') in ('星期六','星期日')
or to_number(to_char(sysdate,'hh24')) not between 9 and 18
then
-- 禁止insert新員工
raise_application_error(-20001,'禁止在非工作時間插入新員工。');
end;
/
注意,上面的raise_application_error函數中的第一個參數的值範圍是-20000~-29999
上面這個例子就是針對錶的一個操作,所以沒有[For each row[when(條件)]]
2、資料的確認
漲工資不能越漲越少,每一條記錄都需要檢查,必然這個觸發器是行級觸發器。
/*
漲後的薪水不可以少於漲前的薪水
1、:old \ :new :代表的是同一條記錄。
2、:old :表示操作該行之前,這一行的值。
3、:new :標示操作該行之後,這一行的值。
*/
create or replace trigger checksalary
before update
on emp
for each row
begin
--漲後的薪水不可以少於漲前的薪水
--if 漲後薪水<漲前薪水 then
if :new.sal < :old.sal then
raise_application_error(-20002,'漲後的薪水不可以少於漲前的薪水。');
end if;
end;
/
上面這個例子就是針對每一行的一個操作,所以有[For each row[when(條件)]]
3、實現審計功能
建立基於值得觸發器
/*
資料庫的審計---》基於值得審計功能
給員工漲工資,當漲後的工資超過6000元的時候,審計該員工的資訊。
*/
--建立表,用於儲存審計資訊
create table audit_info
(
information varchar2(200)
)
create or replace trigger do_audit_emp_salary
after update
on emp
for each row
declare
begin
--當漲後的薪水大於6000,插入審計資訊
if :new.sal > 6000 then
insert into audit_info values(:new.empno|| ' '|| :new.ename||' '||:new.sal);
end if;
end;
/
上面這個例子就是針對每一行的一個操作,所以有[For each row[when(條件)]]
4、完成資料的備份和同步 利用觸發器實現資料的備份和同步:同步備份,沒有延時。
分散式資料庫。
/*
資料的備份和同步
當給員工漲完工資後自動備份新的工資到備份表中。
這是一個行級觸發器。
*/
create or replace trigger sync_salary
after update
on emp
for each row
begin
--當主表更新後,自動更新備份表
update emp_back set sal=:new.sal where empno=:new.empno;
end;
/
上述是同步備份,若無網路壓力,則無延遲。
下面還有一種快照備份我們不做詳述。
本章小結,希望對您有所協助:
資料庫的觸發器是一個與表相關聯的、儲存的PL/SQL程式。
四個情境:
1、複雜的安全性檢查
2、資料的確認
3、資料庫的審計
4、資料的備份和同步