Oracle觸發(fā)器的使用詳解
1.Oracle觸發(fā)器簡介
觸發(fā)器的定義就是說某個條件成立的時候,觸發(fā)器里面所定義的語句就會被自動的執(zhí)行。
因此觸發(fā)器不需要人為的去調(diào)用,也不能調(diào)用。
觸發(fā)器的觸發(fā)條件,其實在定義的時候就已經(jīng)設(shè)定好了。
這里面需要說明一下:觸發(fā)器可以分為語句級觸發(fā)器和行級觸發(fā)器。
簡單的說就是:
- 語句級的觸發(fā)器可以在某些語句執(zhí)行前或執(zhí)行后被觸發(fā);
- 而行級觸發(fā)器則是在定義的了觸發(fā)的表中的行數(shù)據(jù)改變時就會被觸發(fā)一次。
2.語句級觸發(fā)器和行級觸發(fā)器具體舉例
- 在一個表中定義的語句級的觸發(fā)器,當(dāng)這個表被刪除時,程序就會自動執(zhí)行觸發(fā)器里面定義的操作過程。這個就是刪除表的操作就是觸發(fā)器執(zhí)行的條件了。
- 在一個表中定義了行級的觸發(fā)器,那當(dāng)這個表中一行數(shù)據(jù)發(fā)生變化的時候,比如刪除了一行記錄,那觸發(fā)器也會被自動執(zhí)行了。
3.觸發(fā)器的語法
create [or replace] TRIGGER 觸發(fā)器名 觸發(fā)時間 觸發(fā)事件 on 表名 [for each row] begin pl/sql語句 end
語法參數(shù):
- 觸發(fā)器名:觸發(fā)器對象的名稱。由于觸發(fā)器是數(shù)據(jù)庫自動執(zhí)行的,因此該名稱只是一個名稱,沒有實質(zhì)的用途。
- 觸發(fā)時間:指明觸發(fā)器何時執(zhí)行,該值可?。?/li>
- before:表示在數(shù)據(jù)庫動作之前觸發(fā)器執(zhí)行;
- after:表示在數(shù)據(jù)庫動作之后觸發(fā)器執(zhí)行。
- 觸發(fā)事件:指明哪些數(shù)據(jù)庫動作會觸發(fā)此觸發(fā)器:
- insert:數(shù)據(jù)庫插入會觸發(fā)此觸發(fā)器;
- update:數(shù)據(jù)庫修改會觸發(fā)此觸發(fā)器;
- delete:數(shù)據(jù)庫刪除會觸發(fā)此觸發(fā)器。
- 表 名:數(shù)據(jù)庫觸發(fā)器所在的表。
- for each row:對表的每一行觸發(fā)器執(zhí)行一次。如果沒有這一選項,則只對整個表執(zhí)行一次。
-- 禁用觸發(fā)器 ALTER trigger t_1 ENABLE; -- 啟用觸發(fā)器 ALTER trigger t_1 DISABLE; ---刪除觸發(fā)器 DROP trigger t_1;
4.語句級觸發(fā)器案例
在修改表emp之前觸發(fā),目的是不允許在星期四修改表
---RAISE_APPLICATION_ERROR 是觸發(fā)一個異常報錯指令 ---RAISE_APPLICATION_ERROR(自定義的一個異常碼,異常說明)
select to_char(sysdate,'DY') FROM DUAL; -- 星期四
create or replace trigger t_1
before update or insert or delete
-- 語句觸發(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;
-- 測試
insert into emp (empno, ename) values (1111, 'AA');
5.行級觸發(fā)器案例
創(chuàng)建觸發(fā)器,比較emp表中更新的工資不能比原來的工資低
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)在表級觸發(fā)器中
- commit不能放在觸發(fā)器中
select * from emp_sal;

---修改 EMP_SAL 的數(shù)據(jù),看看是否會觸發(fā)異常 update emp_sal set sal=4000 where empno=7788; commit;

修改成功后,emp_923表中會存入舊值:
select * from emp_923;

修改的工資比原來更低:
update emp_sal set sal=1000 where empno=7788; commit;
拋出異常:

測試刪除的觸發(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;
----驗證觸發(fā)器
DELETE FROM EMP_819 T WHERE T.EMPNO = 7788;
COMMIT;---驗證數(shù)據(jù) SELECT * FROM EMP_819;

SELECT * FROM EMP_923;

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle數(shù)據(jù)庫中如何給表賦予權(quán)限
賦權(quán)是指將特定的權(quán)限授予用戶或用戶組,以便他們可以執(zhí)行特定的操作,如查詢、插入、更新和刪除數(shù)據(jù),創(chuàng)建和修改表結(jié)構(gòu),以及執(zhí)行其他管理任務(wù),這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫中如何給表賦予權(quán)限的相關(guān)資料,需要的朋友可以參考下2024-01-01
連接Oracle數(shù)據(jù)庫失敗(ORA-12514)故障排除全過程
Oracle連接失敗是指在使用Oracle數(shù)據(jù)庫進(jìn)行開發(fā)的過程中,服務(wù)器端無法與客戶端連接,從而導(dǎo)致Oracle連接無法成功,影響開發(fā)的效率,下面這篇文章主要給大家介紹了關(guān)于連接Oracle數(shù)據(jù)庫失敗(ORA-12514)故障排除的相關(guān)資料,需要的朋友可以參考下2023-05-05
oracle數(shù)據(jù)庫中chr()函數(shù)和concat函數(shù)的使用說明
這篇文章主要介紹了oracle數(shù)據(jù)庫中chr()函數(shù)和concat函數(shù)的使用說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Oracle 統(tǒng)計用戶下表的數(shù)據(jù)量實現(xiàn)腳本
這篇文章給大家分享Oracle 統(tǒng)計用戶下表的數(shù)據(jù)量實現(xiàn)腳本,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-09-09
oracle數(shù)據(jù)庫表實現(xiàn)自增主鍵的方法實例
Oracle數(shù)據(jù)庫中沒有自增字段,我們可以通過創(chuàng)建序列和觸發(fā)器的方式,間接地實現(xiàn)自增的效果,下面這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫表實現(xiàn)自增主鍵的相關(guān)資料,需要的朋友可以參考下2022-06-06
oracle中l(wèi)eft join和right join的區(qū)別淺談
oracle中l(wèi)eft join和right join的區(qū)別淺談,需要的朋友可以參考一下2013-02-02

