Oracle觸發(fā)器的使用詳解
1.Oracle觸發(fā)器簡(jiǎn)介
觸發(fā)器的定義就是說(shuō)某個(gè)條件成立的時(shí)候,觸發(fā)器里面所定義的語(yǔ)句就會(huì)被自動(dòng)的執(zhí)行。
因此觸發(fā)器不需要人為的去調(diào)用,也不能調(diào)用。
觸發(fā)器的觸發(fā)條件,其實(shí)在定義的時(shí)候就已經(jīng)設(shè)定好了。
這里面需要說(shuō)明一下:觸發(fā)器可以分為語(yǔ)句級(jí)觸發(fā)器和行級(jí)觸發(fā)器。
簡(jiǎn)單的說(shuō)就是:
- 語(yǔ)句級(jí)的觸發(fā)器可以在某些語(yǔ)句執(zhí)行前或執(zhí)行后被觸發(fā);
- 而行級(jí)觸發(fā)器則是在定義的了觸發(fā)的表中的行數(shù)據(jù)改變時(shí)就會(huì)被觸發(fā)一次。
2.語(yǔ)句級(jí)觸發(fā)器和行級(jí)觸發(fā)器具體舉例
- 在一個(gè)表中定義的語(yǔ)句級(jí)的觸發(fā)器,當(dāng)這個(gè)表被刪除時(shí),程序就會(huì)自動(dòng)執(zhí)行觸發(fā)器里面定義的操作過(guò)程。這個(gè)就是刪除表的操作就是觸發(fā)器執(zhí)行的條件了。
- 在一個(gè)表中定義了行級(jí)的觸發(fā)器,那當(dāng)這個(gè)表中一行數(shù)據(jù)發(fā)生變化的時(shí)候,比如刪除了一行記錄,那觸發(fā)器也會(huì)被自動(dòng)執(zhí)行了。
3.觸發(fā)器的語(yǔ)法
create [or replace] TRIGGER 觸發(fā)器名 觸發(fā)時(shí)間 觸發(fā)事件 on 表名 [for each row] begin pl/sql語(yǔ)句 end
語(yǔ)法參數(shù):
- 觸發(fā)器名:觸發(fā)器對(duì)象的名稱。由于觸發(fā)器是數(shù)據(jù)庫(kù)自動(dòng)執(zhí)行的,因此該名稱只是一個(gè)名稱,沒(méi)有實(shí)質(zhì)的用途。
- 觸發(fā)時(shí)間:指明觸發(fā)器何時(shí)執(zhí)行,該值可?。?/li>
- before:表示在數(shù)據(jù)庫(kù)動(dòng)作之前觸發(fā)器執(zhí)行;
- after:表示在數(shù)據(jù)庫(kù)動(dòng)作之后觸發(fā)器執(zhí)行。
- 觸發(fā)事件:指明哪些數(shù)據(jù)庫(kù)動(dòng)作會(huì)觸發(fā)此觸發(fā)器:
- insert:數(shù)據(jù)庫(kù)插入會(huì)觸發(fā)此觸發(fā)器;
- update:數(shù)據(jù)庫(kù)修改會(huì)觸發(fā)此觸發(fā)器;
- delete:數(shù)據(jù)庫(kù)刪除會(huì)觸發(fā)此觸發(fā)器。
- 表 名:數(shù)據(jù)庫(kù)觸發(fā)器所在的表。
- for each row:對(duì)表的每一行觸發(fā)器執(zhí)行一次。如果沒(méi)有這一選項(xiàng),則只對(duì)整個(gè)表執(zhí)行一次。
-- 禁用觸發(fā)器 ALTER trigger t_1 ENABLE; -- 啟用觸發(fā)器 ALTER trigger t_1 DISABLE; ---刪除觸發(fā)器 DROP trigger t_1;
4.語(yǔ)句級(jí)觸發(fā)器案例
在修改表emp之前觸發(fā),目的是不允許在星期四修改表
---RAISE_APPLICATION_ERROR 是觸發(fā)一個(gè)異常報(bào)錯(cuò)指令 ---RAISE_APPLICATION_ERROR(自定義的一個(gè)異常碼,異常說(shuō)明)
select to_char(sysdate,'DY') FROM DUAL; -- 星期四 create or replace trigger t_1 before update or insert or delete -- 語(yǔ)句觸發(fā)器,它將在 EMP 表的 INSERT、UPDATE 或 DELETE 操作之前觸發(fā)。 on emp -- 指定觸發(fā)器應(yīng)用于 EMP 表 for each row begin if to_char(sysdate, 'DY') = '星期四' then RAISE_APPLICATION_ERROR(-20001, '不允許在星期四修改表emp'); end if; end; -- 測(cè)試 insert into emp (empno, ename) values (1111, 'AA');
5.行級(jí)觸發(fā)器案例
創(chuàng)建觸發(fā)器,比較emp表中更新的工資不能比原來(lái)的工資低
create table emp_sal as select * from emp; create table emp_923 as select * from emp where 1=2; create or replace trigger emp_sal_comp_sal_trigg before update on emp_sal for each row begin if :old.sal > :new.sal then RAISE_APPLICATION_ERROR(-20002, '工資不能比之前少'); else insert into emp_923 (empno, sal) values (:old.empno, :old.sal); end if; end;
- :old.和:new.不能出現(xiàn)在表級(jí)觸發(fā)器中
- commit不能放在觸發(fā)器中
select * from emp_sal;
---修改 EMP_SAL 的數(shù)據(jù),看看是否會(huì)觸發(fā)異常 update emp_sal set sal=4000 where empno=7788; commit;
修改成功后,emp_923表中會(huì)存入舊值:
select * from emp_923;
修改的工資比原來(lái)更低:
update emp_sal set sal=1000 where empno=7788; commit;
拋出異常:
測(cè)試刪除的觸發(fā)器:
CREATE TABLE EMP_819 AS SELECT * FROM EMP; CREATE OR REPLACE TRIGGER EMP819_DELETE BEFORE DELETE ON EMP_819 FOR EACH ROW BEGIN ---在刪除數(shù)據(jù)之前往 EMP_923 這張備份表里插入要被刪除的數(shù)據(jù) INSERT INTO EMP_923 (EMPNO, ENAME, SAL) VALUES (:OLD.EMPNO, :OLD.ENAME, :OLD.SAL); END; ----驗(yàn)證觸發(fā)器 DELETE FROM EMP_819 T WHERE T.EMPNO = 7788; COMMIT;
---驗(yàn)證數(shù)據(jù) SELECT * FROM EMP_819;
SELECT * FROM EMP_923;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)中如何給表賦予權(quán)限
賦權(quán)是指將特定的權(quán)限授予用戶或用戶組,以便他們可以執(zhí)行特定的操作,如查詢、插入、更新和刪除數(shù)據(jù),創(chuàng)建和修改表結(jié)構(gòu),以及執(zhí)行其他管理任務(wù),這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)中如何給表賦予權(quán)限的相關(guān)資料,需要的朋友可以參考下2024-01-01連接Oracle數(shù)據(jù)庫(kù)失敗(ORA-12514)故障排除全過(guò)程
Oracle連接失敗是指在使用Oracle數(shù)據(jù)庫(kù)進(jìn)行開(kāi)發(fā)的過(guò)程中,服務(wù)器端無(wú)法與客戶端連接,從而導(dǎo)致Oracle連接無(wú)法成功,影響開(kāi)發(fā)的效率,下面這篇文章主要給大家介紹了關(guān)于連接Oracle數(shù)據(jù)庫(kù)失敗(ORA-12514)故障排除的相關(guān)資料,需要的朋友可以參考下2023-05-05ORACLE實(shí)現(xiàn)自定義序列號(hào)生成的方法
這篇文章主要為大家詳細(xì)介紹了ORACLE實(shí)現(xiàn)自定義序列號(hào)生成的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10oracle數(shù)據(jù)庫(kù)中chr()函數(shù)和concat函數(shù)的使用說(shuō)明
這篇文章主要介紹了oracle數(shù)據(jù)庫(kù)中chr()函數(shù)和concat函數(shù)的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Oracle 統(tǒng)計(jì)用戶下表的數(shù)據(jù)量實(shí)現(xiàn)腳本
這篇文章給大家分享Oracle 統(tǒng)計(jì)用戶下表的數(shù)據(jù)量實(shí)現(xiàn)腳本,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09oracle數(shù)據(jù)庫(kù)表實(shí)現(xiàn)自增主鍵的方法實(shí)例
Oracle數(shù)據(jù)庫(kù)中沒(méi)有自增字段,我們可以通過(guò)創(chuàng)建序列和觸發(fā)器的方式,間接地實(shí)現(xiàn)自增的效果,下面這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫(kù)表實(shí)現(xiàn)自增主鍵的相關(guān)資料,需要的朋友可以參考下2022-06-06oracle中l(wèi)eft join和right join的區(qū)別淺談
oracle中l(wèi)eft join和right join的區(qū)別淺談,需要的朋友可以參考一下2013-02-02