Oracle數(shù)據(jù)庫(kù)中的觸發(fā)器詳解
一、什么是觸發(fā)器?
觸發(fā)器:trigger,是一種特殊的數(shù)據(jù)庫(kù)對(duì)象,它可以在特定的事件發(fā)生時(shí)自動(dòng)執(zhí)行一些操作,可以用于實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)約束、數(shù)據(jù)驗(yàn)證、數(shù)據(jù)審計(jì)等功能。
二、觸發(fā)器的基本原理
觸發(fā)器類似于過(guò)程、函數(shù),其包括聲明部分、異常處理部分,并且都有名稱、都被存儲(chǔ)在數(shù)據(jù)庫(kù)中。但與普通的過(guò)程、函數(shù)不同的是,函數(shù)需要用戶顯式地調(diào)用才執(zhí)行,而觸發(fā)器則是當(dāng)某些事件發(fā)生時(shí),由Oracle自動(dòng)執(zhí)行,觸發(fā)器的執(zhí)行對(duì)用戶來(lái)說(shuō)是透明的。對(duì)其總結(jié)有如下幾點(diǎn):
2.1.觸發(fā)器與表相關(guān)聯(lián):
每個(gè)觸發(fā)器都與一個(gè)特定的表相關(guān)聯(lián),并且只有在該表上發(fā)生的特定事件(如INSERT、UPDATE、DELETE)時(shí)才會(huì)觸發(fā)。
2.2.觸發(fā)器定義:
觸發(fā)器定義包括觸發(fā)事件、觸發(fā)時(shí)間和觸發(fā)操作(例如,執(zhí)行一個(gè)存儲(chǔ)過(guò)程或更新一個(gè)表)。
2.3.觸發(fā)器存儲(chǔ)在數(shù)據(jù)庫(kù)中:
觸發(fā)器是存儲(chǔ)在數(shù)據(jù)庫(kù)中的對(duì)象,它們與其他數(shù)據(jù)庫(kù)對(duì)象一樣可以被管理和維護(hù)。
2.4.觸發(fā)器是自動(dòng)執(zhí)行的:
當(dāng)與其相關(guān)聯(lián)的表上發(fā)生特定事件時(shí),觸發(fā)器會(huì)自動(dòng)執(zhí)行,而不需要手動(dòng)干預(yù)。
2.5.觸發(fā)器可以在事務(wù)中使用:
觸發(fā)器可以在事務(wù)中使用,以確保數(shù)據(jù)的一致性和完整性。
三、觸發(fā)器的類型
Oracle中的觸發(fā)器類型有如下四種:
3.1DML觸發(fā)器:
對(duì)表或視圖執(zhí)行DML操作時(shí)觸發(fā)。其中包括:
3.1.1. 行級(jí)觸發(fā)器(Row-Level Triggers):
當(dāng)對(duì)表中的一行數(shù)據(jù)進(jìn)行INSERT、UPDATE或DELETE操作時(shí),會(huì)觸發(fā)行級(jí)觸發(fā)器執(zhí)行。行級(jí)觸發(fā)器可以在每行數(shù)據(jù)發(fā)生變化時(shí),對(duì)該行數(shù)據(jù)進(jìn)行操作。
3.1.2. 語(yǔ)句級(jí)觸發(fā)器(Statement-Level Triggers):
當(dāng)對(duì)表進(jìn)行INSERT、UPDATE或DELETE操作時(shí),會(huì)觸發(fā)語(yǔ)句級(jí)觸發(fā)器執(zhí)行。語(yǔ)句級(jí)觸發(fā)器可以在整個(gè)語(yǔ)句執(zhí)行之前或之后對(duì)數(shù)據(jù)進(jìn)行操作。
3.2. 觸發(fā)器的BEFORE類型和AFTER類型:
BEFORE類型的觸發(fā)器在數(shù)據(jù)插入、更新或刪除之前觸發(fā),可以用來(lái)驗(yàn)證數(shù)據(jù)的正確性、設(shè)置默認(rèn)值等;AFTER類型的觸發(fā)器在數(shù)據(jù)插入、更新或刪除之后觸發(fā),可以用來(lái)記錄數(shù)據(jù)變化、更新其他表等。
3.3. INSTEAD OF觸發(fā)器:
INSTEAD OF觸發(fā)器是一種特殊的觸發(fā)器,它可以用來(lái)替代INSERT、UPDATE或DELETE操作,當(dāng)對(duì)視圖進(jìn)行INSERT、UPDATE或DELETE操作時(shí),可以通過(guò)INSTEAD OF觸發(fā)器對(duì)其進(jìn)行操作。它只定義在視圖上,用來(lái)替換實(shí)際的操作語(yǔ)句。
3.4系統(tǒng)觸發(fā)器(數(shù)據(jù)庫(kù)觸發(fā)器):
每當(dāng)一個(gè)用戶或數(shù)據(jù)庫(kù)中一個(gè)數(shù)據(jù)事件發(fā)生時(shí)或系統(tǒng)事件(如登錄或關(guān)閉系統(tǒng))發(fā)生時(shí)觸發(fā),即對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行操作(如DDL語(yǔ)句、啟動(dòng)或關(guān)閉數(shù)據(jù)庫(kù)等系統(tǒng)事件)時(shí)觸發(fā)。
在Oracle11g和Oracle12c中可以定義和使用的觸發(fā)器類型總結(jié)有以下幾種:
- Ⅰ、簡(jiǎn)單DML觸發(fā)器:包括BEFORE、AFTER和INSERT OF觸發(fā)器;
- Ⅱ、組合(復(fù)合)觸發(fā)器;
- Ⅲ、非DML觸發(fā)器,包括DDL事件觸發(fā)器和數(shù)據(jù)庫(kù)事件觸發(fā)器。
四、觸發(fā)器的作用
主要作用包括:
4.1. 數(shù)據(jù)完整性控制:
觸發(fā)器可以用于控制數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性,例如在插入、更新或刪除數(shù)據(jù)時(shí)驗(yàn)證數(shù)據(jù)的有效性,確保數(shù)據(jù)滿足特定的業(yè)務(wù)規(guī)則和約束條件。
4.2. 數(shù)據(jù)庫(kù)自動(dòng)化:
觸發(fā)器可以自動(dòng)化一些常見(jiàn)的數(shù)據(jù)庫(kù)操作,例如在插入數(shù)據(jù)時(shí)自動(dòng)更新其他表的數(shù)據(jù)、在刪除數(shù)據(jù)時(shí)自動(dòng)刪除相關(guān)的數(shù)據(jù)等。
4.3. 數(shù)據(jù)審計(jì):
觸發(fā)器可以用于跟蹤數(shù)據(jù)庫(kù)中的數(shù)據(jù)變化,例如記錄數(shù)據(jù)的修改時(shí)間、修改人、修改前后的值等,以及在發(fā)生異常情況時(shí)自動(dòng)發(fā)送警報(bào)。
4.4. 數(shù)據(jù)復(fù)制:
觸發(fā)器可以用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)復(fù)制,例如將一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)自動(dòng)復(fù)制到另一個(gè)數(shù)據(jù)庫(kù)中,以實(shí)現(xiàn)數(shù)據(jù)同步和備份。
4.5. 業(yè)務(wù)流程自動(dòng)化:
觸發(fā)器可以用于自動(dòng)化業(yè)務(wù)流程,例如在訂單提交后自動(dòng)發(fā)送郵件通知客戶、在庫(kù)存不足時(shí)自動(dòng)向供應(yīng)商下訂單等。
五、觸發(fā)器使用場(chǎng)景
在以下情況下可以使用觸發(fā)器:
- Ⅰ、對(duì)一個(gè)特定的操作要確保所有相關(guān)的操作都被執(zhí)行;
- Ⅱ、執(zhí)行集中的全局的操作,并且觸發(fā)器的語(yǔ)句的觸發(fā)器獨(dú)立于用戶,也獨(dú)立于發(fā)出語(yǔ)句的應(yīng)用程序。
在以下情況不必設(shè)計(jì)觸發(fā)器:
- Ⅰ、其功能已經(jīng)嵌入Oracle服務(wù)器,如實(shí)現(xiàn)完整性規(guī)則應(yīng)該聲明Oracle約束,而不是定義觸發(fā)器;
- Ⅱ、重復(fù)其他觸發(fā)器的功能。
六、觸發(fā)器的語(yǔ)法格式
創(chuàng)建觸發(fā)器的語(yǔ)句是CREATE TRIGGER,其語(yǔ)法格式如下:
--整體組成部分包括:
CREATE OR REPLACE TRIGGER<觸發(fā)器名>
觸發(fā)條件
觸發(fā)體
---------------------------------------------------
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name [FOR EACH ROW]
[WHEN (condition)]
DECLARE
-- declarations
BEGIN
-- trigger body
END;
--理解如下:
create or replace trigger tri_name
before|after --before是事前觸發(fā)器,after是事后觸發(fā)器
dml操作 [of 列] on 表 | dml操作 or dml操作 or.... --insert on update on delete
如果是插入則..刪除則..更新則..
前者鎖定某個(gè)操作針對(duì)表,后者針對(duì)不同的dml操作
[for each row]--默認(rèn)語(yǔ)句級(jí),寫上是行級(jí)
[declare 聲明]
begin
要執(zhí)行的語(yǔ)句;
end;舉例:
創(chuàng)建emp1和emp2表,其中emp1有emp的20部門的數(shù)據(jù),emp2是空表,表格式同emp;
create table emp1 as select * from emp where deptno=20; create table emp2 as select * from emp where 1=2;
此時(shí)emp1表的數(shù)據(jù)如下:

emp2表如下:

對(duì)emp1創(chuàng)建觸發(fā)器,要求是當(dāng)它被插入數(shù)據(jù)時(shí),向emp2的empno插入一個(gè)1;
create or replace trigger tri_insert before insert on emp1 for each row begin insert into emp2(empno) values (1); --commit; end;
測(cè)試: 假如向emp1表插入10部門的員工信息:
insert into emp1 select * from emp where deptno=10;
執(zhí)行后,看emp1表:

查看emp2表:

發(fā)現(xiàn)表中插入了三個(gè)1,即emp1表每插入一條數(shù)據(jù),emp2表就插入一個(gè)1。
那么再創(chuàng)建一個(gè)觸發(fā)器,要求是當(dāng)emp1表被刪除數(shù)據(jù)時(shí),向emp2表的ename列插入" delete" 向hiredate列插入"刪除時(shí)間",則語(yǔ)句如下:
create or replace trigger t1 before
delete on emp1
for each row
begin
insert into emp2(ename,hiredate) values('delete',sysdate);
end;測(cè)試:假如刪除emp1表20部門的員工信息 :
delete from emp1 where deptno=20;
執(zhí)行后,查看emp1表:

查看emp2表:

此時(shí)發(fā)現(xiàn)emp2中已經(jīng)多了5條數(shù)據(jù)。
七、觸發(fā)器發(fā)生的相關(guān)概念
(1)觸發(fā)事件
引起觸發(fā)器被觸發(fā)的事件。如DML語(yǔ)句(如INSERT、UPDATE、DELETE語(yǔ)句對(duì)表或視圖執(zhí)行數(shù)據(jù)處理操作)、DDL語(yǔ)句(如CREATE、ALTER、DROP語(yǔ)句在數(shù)據(jù)庫(kù)中創(chuàng)建、修改、刪除模式對(duì)象)、數(shù)據(jù)庫(kù)系統(tǒng)事件(如系統(tǒng)啟動(dòng)或退出、異常錯(cuò)誤)、用戶事件(如登錄或退出數(shù)據(jù)庫(kù))。
其中:
- 1. INSERT:當(dāng)有新記錄插入到表中時(shí)觸發(fā)觸發(fā)器。
- 2. UPDATE:當(dāng)表中的記錄被修改時(shí)觸發(fā)觸發(fā)器。
- 3. DELETE:當(dāng)表中的記錄被刪除時(shí)觸發(fā)觸發(fā)器。
(2)觸發(fā)條件
觸發(fā)條件是由WHEN子句指定的一個(gè)邏輯表達(dá)式。只有當(dāng)該表達(dá)式的值為TRUE時(shí),遇到觸發(fā)事件才會(huì)自動(dòng)執(zhí)行觸發(fā)器,使其執(zhí)行觸發(fā)操作,否則即便遇到觸發(fā)事件也不會(huì)執(zhí)行觸發(fā)器。
(3)觸發(fā)對(duì)象
觸發(fā)對(duì)象包括表、視圖、模式、數(shù)據(jù)庫(kù)。只有在這些對(duì)象上發(fā)生了符合觸發(fā)條件的觸發(fā)事件,才會(huì)執(zhí)行觸發(fā)操作。
(4)觸發(fā)操作
觸發(fā)器所要執(zhí)行的PL/SQL程序,即執(zhí)行部分。
(5)觸發(fā)時(shí)機(jī)
觸發(fā)時(shí)機(jī)指定觸發(fā)器的觸發(fā)時(shí)間。如果指定為BEFORE,則表示在執(zhí)行DML操作之前觸發(fā),以便防止某些錯(cuò)誤操作發(fā)生或?qū)崿F(xiàn)某些業(yè)務(wù)規(guī)則:如果指定為AFTER,則表示在DML操作之后觸發(fā),以便記錄該操作或做某些事后處理
(6)條件謂詞
當(dāng)在觸發(fā)器中包含了多個(gè)觸發(fā)事件(NSERT、UPDATE、DELETE)的組合時(shí),為了分別針對(duì)不同的事件進(jìn)行不同的處理,需要使用Oracle提供的如下條件謂詞。
- INSERTING:當(dāng)觸發(fā)事件是INSERT時(shí),取值為TRUE,否則為FALSE。
- UPDATING[(column_1,column_2,,column_n)]:當(dāng)觸發(fā)事件是UPDATE時(shí),如果修改了column_x列,則取值為TRUE,否則為FALSE,其中column_x是可選的。
- DELETING:當(dāng)觸發(fā)事件是DELETE時(shí),取值為TRUE,否則為FALSE。
(7)觸發(fā)子類型觸發(fā)子類型分別為行觸發(fā)(row)和語(yǔ)句觸發(fā)(statement),行觸發(fā)即對(duì)每一行操作時(shí)都要觸發(fā),而語(yǔ)句觸發(fā)只對(duì)這種操作觸發(fā)一次(即行級(jí)別觸發(fā)器可以在每個(gè)受影響的行上執(zhí)行操作,而語(yǔ)句級(jí)別觸發(fā)器則只在整個(gè)語(yǔ)句執(zhí)行完成后執(zhí)行一次。)。一般進(jìn)行SQL語(yǔ)句操作時(shí)都應(yīng)是行觸發(fā),只有對(duì)整個(gè)表作安全檢查(即防止非法操作)時(shí)才用語(yǔ)句觸發(fā)。如果省略此項(xiàng),默認(rèn)為語(yǔ)句觸發(fā)。
對(duì)比語(yǔ)句級(jí)觸發(fā)器和行級(jí)觸發(fā)器:
| 語(yǔ)句級(jí)觸發(fā)器 | 行級(jí)觸發(fā)器 |
| 是創(chuàng)建觸發(fā)器時(shí)的默認(rèn)類型 | 創(chuàng)建觸發(fā)器時(shí)使用FOR EACH ROW子句 |
| 對(duì)于觸發(fā)的事件只觸發(fā)一次 | 對(duì)受觸發(fā)事件影響的每行觸發(fā)一次 |
| 沒(méi)有受影響的行時(shí)也要觸發(fā)一次 | 觸發(fā)事件未影響任何數(shù)據(jù)行就不觸發(fā) |
此外,觸發(fā)器中還有兩個(gè)相關(guān)值,分別對(duì)應(yīng)被觸發(fā)的行中的舊表值和新表值,用old和new來(lái)表示,可以在觸發(fā)器中訪問(wèn)NEW和OLD偽記錄。
:old.列--之前的,老的數(shù)據(jù) :new.列--之后的,新的數(shù)據(jù)
注意:
| insert | update | delete | |
| :old.列 | null | 修改之前的值 | 刪除之前的值 |
| :new.列 | 插入的值 | 修改之后的值 | null |
在使用OLD和NEW限定詞時(shí),還需要注意:
- 只在行觸發(fā)器中有OLD和NEW限定詞;
- 在每個(gè)SQL和PL/SQL語(yǔ)句中,這兩個(gè)限定詞前必須冠以冒號(hào)(:);
- 如果這兩個(gè)限定詞是在WHEN所在條件中引用就不必冠以冒號(hào);
- 如果在較大的表上執(zhí)行許多修改,行級(jí)觸發(fā)器可能降低系統(tǒng)的效率。
把上面例子中emp2表的hiredate列的類型改成timestamp;
alter table emp2 modify hiredate timestamp;
注意:
要修改列的類型時(shí)該列一定要為空null;
原來(lái)hiredate的類型是varchar,如圖:

更改后如圖:

按照下面要求完成:
向emp1創(chuàng)建觸發(fā)器,當(dāng)emp1的ename被更新時(shí),向emp2的ename插入更新前和更新后的名字,job列插入更新前/更新后,hiredate插入更新時(shí)的系統(tǒng)時(shí)間戳。則語(yǔ)句如下:
create or replace trigger tri_update before
update of ename on emp1
for each row
begin
insert into emp2(ename,job,hiredate)
values(:old.ename,'更新前',systimestamp);
insert into emp2(ename,job,hiredate)
values(:new.ename,'更新后',systimestamp);
--commit;
end;測(cè)試:假如將emp1表的ename列改為小寫:
update emp1 set ename=lower(ename);
那么執(zhí)行后,查看emp1表:

查看emp2表:

通過(guò)表結(jié)果可以看出emp1更新三條記錄,emp2就會(huì)插入對(duì)應(yīng)的3條更新前/后的數(shù)據(jù)記錄。
八、觸發(fā)器和異常的聯(lián)動(dòng)應(yīng)用
比如:
向emp1表插入數(shù)據(jù)時(shí)的當(dāng)前時(shí)間小時(shí)數(shù)為12和24之間時(shí),拋出異常,錯(cuò)誤代碼為-20000,錯(cuò)誤描述為“時(shí)間不符”,那么語(yǔ)句如下:
create or replace trigger tri_1 before insert on emp1 begin if to_char(sysdate,'hh24') between 12 and 24 then raise_application_error(-20000,'時(shí)間不符'); end if; end;
測(cè)試:假如此時(shí)向emp1表插入emp表的全部數(shù)據(jù) :
--查看當(dāng)前時(shí)間: select sysdate from dual;
結(jié)果如下:

開(kāi)始插入數(shù)據(jù):
insert into emp1 select * from emp;
執(zhí)行后,頁(yè)面出現(xiàn)彈窗如圖所示:

使用觸發(fā)器也能實(shí)現(xiàn)一表多插的情況 :
比如:對(duì)emp1創(chuàng)建一個(gè)觸發(fā)器,當(dāng)向emp1插入數(shù)據(jù)時(shí),
--如果部門是10部門,同時(shí)插入到emp2表
--如果部門是20部門,打印部門編號(hào)和姓名
--如果部門是30部門,插入后工資增加10000;
create or replace trigger tri_2 before
insert on emp1
for each row
begin
if :new.deptno= 10 then
insert into emp2 values(:new.empno, :new.ename,
:new.job, :new.mgr, :new.hiredate,
:new.sal, :new.comm, :new.deptno);
elsif :new.deptno=20 then
dbms_output.put_line(:new.deptno||' '||:new.ename);
elsif :new.deptno=30 then
:new.sal:=:new.sal+10000;
end if;
end;測(cè)試:表emp1和emp2是空表,假如向emp1插入emp表的數(shù)據(jù):
insert into emp1 select * from emp;
那么執(zhí)行后查看表emp1,如圖所示:

為了方便對(duì)比,查詢下emp表30部門的薪資:
select * from emp where deptno=30;

查看emp2如圖所示:

從表中可以看出10部門數(shù)據(jù)已經(jīng)插入到emp2表中。
九、觸發(fā)器的刪除
觸發(fā)器可以通過(guò)DROP TRIGGER語(yǔ)句刪除,語(yǔ)法如下:
DROP TRIGGER trigger_name;
十、觸發(fā)器的兩種狀態(tài)
在Oracle中,觸發(fā)器有兩種狀態(tài):啟用狀態(tài)和禁用狀態(tài)。
10.1. 啟用狀態(tài):
當(dāng)觸發(fā)器處于啟用狀態(tài)時(shí),它會(huì)自動(dòng)執(zhí)行預(yù)定義的操作,以響應(yīng)與其相關(guān)聯(lián)的事件??梢允褂?strong>ALTER TRIGGER語(yǔ)句來(lái)啟用觸發(fā)器,例如:
ALTER TRIGGER trigger_name ENABLE;
10.2. 禁用狀態(tài):
當(dāng)觸發(fā)器處于禁用狀態(tài)時(shí),它不會(huì)響應(yīng)與其相關(guān)聯(lián)的事件,也不會(huì)自動(dòng)執(zhí)行預(yù)定義的操作??梢允褂?strong>ALTER TRIGGER語(yǔ)句來(lái)禁用觸發(fā)器,例如:
ALTER TRIGGER trigger_name DISABLE;
可以使用以下語(yǔ)句來(lái)查看觸發(fā)器的狀態(tài):
SELECT trigger_name, status FROM user_triggers;
觸發(fā)器的啟用狀態(tài)和禁用狀態(tài)可以根據(jù)具體的業(yè)務(wù)需求來(lái)靈活切換。例如,在開(kāi)發(fā)和測(cè)試階段,可以禁用某些觸發(fā)器來(lái)方便調(diào)試和測(cè)試,而在生產(chǎn)環(huán)境中,應(yīng)該保證觸發(fā)器處于啟用狀態(tài),以確保數(shù)據(jù)的完整性和一致性。
為什么要引入兩種狀態(tài)?
Oracle引入觸發(fā)器的兩種狀態(tài)(激活狀態(tài)和禁用狀態(tài))是為了方便管理和控制觸發(fā)器的執(zhí)行。觸發(fā)器的激活狀態(tài)表示觸發(fā)器可以被自動(dòng)觸發(fā)執(zhí)行,而禁用狀態(tài)表示觸發(fā)器不會(huì)被自動(dòng)觸發(fā)執(zhí)行。通過(guò)將觸發(fā)器設(shè)置為禁用狀態(tài),可以臨時(shí)停止觸發(fā)器的執(zhí)行,以便進(jìn)行維護(hù)或調(diào)試。同時(shí),禁用狀態(tài)還可以用來(lái)控制觸發(fā)器的執(zhí)行順序,以便在需要的時(shí)候先執(zhí)行某些觸發(fā)器。觸發(fā)器的狀態(tài)可以通過(guò)ALTER TRIGGER語(yǔ)句來(lái)進(jìn)行修改。
十一、觸發(fā)器信息獲取及理解
已經(jīng)會(huì)創(chuàng)建和使用觸發(fā)器,那么應(yīng)該如何獲取當(dāng)前用戶中有關(guān)觸發(fā)器的信息以及如何理解這些信息?
其實(shí)可以使用Oracle系統(tǒng)視圖來(lái)獲取當(dāng)前用戶中有關(guān)觸發(fā)器的信息,其中包括以下幾個(gè)常用視圖:
- 1. ALL_TRIGGERS:顯示當(dāng)前用戶下的所有觸發(fā)器信息,包括觸發(fā)器名稱、所屬表名、觸發(fā)器類型、觸發(fā)事件、觸發(fā)器狀態(tài)等。
- 2. USER_TRIGGERS:與ALL_TRIGGERS類似,但只顯示當(dāng)前用戶下的觸發(fā)器信息。
- 3. ALL_TRIGGER_COLS:顯示當(dāng)前用戶下所有觸發(fā)器相關(guān)的列信息,包括列名、數(shù)據(jù)類型、長(zhǎng)度等。
- 4. USER_TRIGGER_COLS:與ALL_TRIGGER_COLS類似,但只顯示當(dāng)前用戶下的觸發(fā)器相關(guān)的列信息。
這些視圖提供了觸發(fā)器的相關(guān)信息,可以通過(guò)查詢這些視圖來(lái)獲取需要的信息。例如,可以使用以下SQL語(yǔ)句查詢當(dāng)前用戶下的所有觸發(fā)器信息:
SELECT trigger_name, table_name, trigger_type, triggering_event, status FROM user_triggers;
其中,trigger_name表示觸發(fā)器名稱,table_name表示觸發(fā)器所屬表名,trigger_type表示觸發(fā)器類型(BEFORE或AFTER),triggering_event表示觸發(fā)事件(INSERT、UPDATE或DELETE),status表示觸發(fā)器狀態(tài)(ENABLED或DISABLED)。
理解這些信息可以幫助我們更好地管理和控制觸發(fā)器的執(zhí)行,例如,通過(guò)查看觸發(fā)器狀態(tài)來(lái)判斷是否需要禁用該觸發(fā)器,或者通過(guò)查看觸發(fā)器相關(guān)的列信息來(lái)確定觸發(fā)器的執(zhí)行邏輯。
十二、觸發(fā)器的危害
12.1.性能問(wèn)題:
如果觸發(fā)器邏輯復(fù)雜,執(zhí)行時(shí)間長(zhǎng),會(huì)影響整個(gè)數(shù)據(jù)庫(kù)的性能,尤其是在高并發(fā)環(huán)境下。
12.2.數(shù)據(jù)不一致:
如果觸發(fā)器邏輯有誤或觸發(fā)器與其他數(shù)據(jù)庫(kù)對(duì)象之間的關(guān)系不正確,可能會(huì)導(dǎo)致數(shù)據(jù)不一致的問(wèn)題。
12.3.難以維護(hù):
觸發(fā)器可以在多個(gè)表之間進(jìn)行數(shù)據(jù)同步或其他操作,但觸發(fā)器的復(fù)雜性和維護(hù)難度也會(huì)隨之增加。
12.4.安全問(wèn)題:
如果觸發(fā)器沒(méi)有正確限制訪問(wèn)權(quán)限,可能會(huì)被惡意用戶利用,造成安全漏洞。
總結(jié):
觸發(fā)器的執(zhí)行會(huì)增加數(shù)據(jù)庫(kù)的負(fù)載,從而影響數(shù)據(jù)庫(kù)的性能。
觸發(fā)器的設(shè)計(jì)和維護(hù)需要較高的技能水平和經(jīng)驗(yàn),否則可能會(huì)引起數(shù)據(jù)不一致等問(wèn)題。
觸發(fā)器的執(zhí)行順序可能會(huì)影響業(yè)務(wù)邏輯,需要進(jìn)行合理的設(shè)計(jì)和管理。
觸發(fā)器的使用可能會(huì)增加數(shù)據(jù)庫(kù)的復(fù)雜性,從而增加了數(shù)據(jù)庫(kù)管理的難度。
遺留問(wèn)題(待解決):
怎樣利用觸發(fā)器來(lái)實(shí)現(xiàn)完整性約束?
INSTEAD OF觸發(fā)器的創(chuàng)建和測(cè)試如何實(shí)現(xiàn)?
目前還未理解這兩個(gè)問(wèn)題,后續(xù)會(huì)花時(shí)間再學(xué)習(xí)和總結(jié)一下?。?!
總結(jié)
到此這篇關(guān)于Oracle數(shù)據(jù)庫(kù)中的觸發(fā)器詳解的文章就介紹到這了,更多相關(guān)Oracle觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle如何實(shí)現(xiàn)把B表某一字段更新到A表
這篇文章主要給大家介紹了關(guān)于Oracle如何實(shí)現(xiàn)把B表某一字段更新到A表的相關(guān)資料,在Oracle中使用一個(gè)表的字段來(lái)更新另一個(gè)表的字段,可以采用UPDATE SELECT語(yǔ)句,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-07-07
Oracle數(shù)據(jù)庫(kù)更新大批量數(shù)據(jù)案例
今天小編就為大家分享一篇關(guān)于Oracle數(shù)據(jù)庫(kù)更新大批量數(shù)據(jù)案例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
ORACLE中如何找到未提交事務(wù)的SQL語(yǔ)句詳解
這篇文章主要給大家介紹了關(guān)于ORACLE中如何找到未提交事務(wù)的SQL語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ORACLE具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Oracle中dbms_output.put_line的用法實(shí)例
最近寫了oracle過(guò)程,有個(gè)ORACLE中dbms_output.put_line的相關(guān)問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于Oracle中dbms_output.put_line的用法實(shí)例,需要的朋友可以參考下2022-06-06
Oracle 8x監(jiān)控sysdba角色用戶登陸情況
Oracle 8x監(jiān)控sysdba角色用戶登陸情況...2007-03-03
oracle 會(huì)話 死鎖 執(zhí)行sql 執(zhí)行job的方法
這篇文章主要介紹了oracle 會(huì)話 死鎖 執(zhí)行sql 執(zhí)行job的方法,需要的朋友可以參考下2015-12-12
Oracle Arraysize設(shè)置對(duì)于邏輯讀的影響實(shí)例分析
這篇文章主要介紹了Oracle Arraysize設(shè)置對(duì)于邏輯讀的影響實(shí)例分析,通過(guò)設(shè)置Arraysize大幅減少了邏輯讀的次數(shù)和網(wǎng)絡(luò)往返次數(shù),需要的朋友可以參考下2014-07-07

