【Oracle】触发器最系统入门学习指导
前言:通過本次學習您可以學到什么
目錄:
一、什么是觸發器?
二、觸發器的應用場景是什么?
? 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、數據的備份和同步
總結
以上是生活随笔為你收集整理的【Oracle】触发器最系统入门学习指导的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle的存储过程和存储函数
- 下一篇: 帆软系统参数