觸發器的四個應用場景

2021-10-10 23:09:46 字數 3488 閱讀 1598

1.複雜的安全性檢查:比如:禁止在非工作時間插入新員工

2.資料庫的確認:比如:漲工資,工資應該越長越多的,如果越長越少就不叫漲工資了

3.資料庫審計:比如:跟蹤表上操作的記錄,比如什麼時間什麼人操作了資料庫,操作了表上的 記錄是什麼等

4.資料庫的備份和同步:比如有兩個資料庫乙個在北京乙個在上海,在北京的資料庫是主資料庫,在上海的資料庫是備用資料庫,在主資料庫中的資料被修改了以後可以通過觸發器監聽,如果被修改會將修改的資料傳遞給備份資料庫,當主資料崩潰以後不影響資料的使用

觸發器使用場景一:

複雜的安全性檢查

禁止在非工作時間插入新員工

–週末:select to_char(sysdate,『day』) from dual in (『星期六』,『星期日』);

–上班前,下班後:select to_number(to_char(sysdate,『hh24』)) not between 9 and 18;

–不管插入10個員工還是1個員工,插入操作都只是對錶操作一次,所以使用語句級觸發器

create

orreplace

trigger securityemp

​before insert

​on emp

​begin

​ if to_char(sysdate,

'day')in

('星期六'

,'星期日')or

​ to_number(to_char(sysdate,

'hh24'))

notbetween

9and

18then

--禁止insert新員工

-20007

,'禁止在非工作時間插入新員工');

​ --自定義的錯誤**比如在-20000-20009區間

​ endif;

​end

;

執行如下插入語句時當不滿足9:00-18:00之間或者在非週末時間會觸發以上觸發器

insert

into emp(empno,ename,sal,deptno)

values

(1002

,'tom'

,3000,10

);

觸發器使用場景二:資料的確認

漲工資不能越漲越少

漲工資的時候可能給1個員工漲工資,也可能給很多個員工漲工資,對每一條記錄都要做檢查

所以要使用行級觸發器

create

orreplace

trigger checksalary

​before update

--漲工資之前需要檢查一下漲後的工資是否少於漲錢的工資

​on emp

​for each row

​begin

​ --if 張後的薪水《漲錢的薪水 then

​ if :new.sal<:old.sal then>

20008

,'漲後的薪水不能少於漲前的薪水,漲之後的薪水:'

||:new.sal||

' 漲之前的薪水:'

||:old.sal);​

endif;

​end

;

–:ord和:new 他們代表的是同一條記錄,

–:ord是表示操作該行之前,這一行的值

–:new是表示操作該行之後,這一行的值

執行下面更新語句不會觸發觸發器:

update emp set sal=sal+

1where empno=

7839

;

執行下面更新語句會觸發觸發器,因為修改後的工資比修改前要低

update emp set sal=sal-

1where empno=

7839

;

觸發器使用場景三:資料庫的審計—>基於值的審計功能

給員工漲工資,當漲後的薪水超過6000塊錢的時候,我們審計該員工的資訊

準備工作,建立一張表用於儲存審計資訊

create

table audit_info_emp(

​information varchar2(

200)

);

給漲工資的每個員工都需要觸發該觸發器,所以應使用行級觸發器

create

orreplace

trigger do_audit_emp_salary

​after

update

​on emp

​for each row

​begin

--當漲後的薪水大於6000,插入審計資訊

if:new.sal>

6000

then

​ insert

into audit_info_epm values

(:new.empno||

' '||:new.ename||

' '||:new.sal);​

endif;​

end;

使用如下更新語句給所以員工漲2000工資,漲薪後超過6000的員工會被寫入審計表

update emp set sal=sal+

2000;​

commit

;

觸發器使用場景四:資料庫的備用和同步

利用觸發器實現資料的同步部分

準備工作:emp表:源資料表 emp_back表:模擬emp表的備份表

–不加where條件或者加了where條件為true為複製表結構及資料

create

table emp_back as

select

*from emp;

當給員工漲完工資後,自動備份新的工資到備份表中

由於每一位漲工資的員工都需要觸發該觸發器,所以也是使用行級觸發器

create

orreplace

trigger sync_salary

​after

update

​on emp

​for each row

​begin

-- 當主表更新後,自動更新備份表

update emp_back set sal=:new.sal where empno=:new.empno;

​end

;

使用如下更新語句會觸發該觸發器同步資料到備份表

資料庫觸發器應用場景

一 實施複雜的安全性檢查 create or replace trigger mytrigger before insert on emp begin if to char sysdate,day in 星期六 星期日 orto number to char sysdate,hh24 not bet...

四個錶用觸發器級聯刪除Oracle

四個錶用觸發器級聯刪除oracle 有四個表,在建表的時候不允許建立外來鍵,其中資料表中有4 個級聯 a系統 aid.b資料庫 bid,aid.c資料庫表 cid,bid.d表的字段 did,cid.不使用約束條件,在orcle 中進行級聯刪除。刪除 a的時候必須把 a下面所有與 aid相同的 b資...

資料庫的觸發器的使用場景

觸發器,需要有觸發條件,當條件滿足以後做什麼操作。觸發器用處還是很多的,比如校內網 開心網 facebook,你發乙個日誌,自動通知好友,其實就是在增加日誌時做乙個後觸發,再向通知表中寫入條目。因為觸發器效率高。而uch沒有用觸發器,效率和資料處理能力都很低。每插入乙個帖子,都希望將版面表中的最後發...