鍍金池/ 教程/ 數(shù)據(jù)庫/ PL/SQL觸發(fā)器
PL/SQL記錄
PL/SQL基本語法
PL/SQL集合
PL/SQL包
PL/SQL關(guān)系運(yùn)算符
PL/SQL比較運(yùn)算符
PL/SQL條件控制
PL/SQL字符串
PL/SQL算術(shù)運(yùn)算符
PL/SQL變量
PL/SQL IF-THEN-ELSIF語句
PL/SQL函數(shù)
PL/SQL異常
PL/SQL FOR循環(huán)語句
PL/SQL日期及時(shí)間
PL/SQL EXIT語句
PL/SQL DBMS輸出
PL/SQL過程
PL/SQL CONTINUE語句
PL/SQL數(shù)組
PL/SQL嵌套IF-THEN-ELSE語句
PL/SQL事務(wù)
PL/SQL CASE語句
PL/SQL IF-THEN語句
PL/SQL GOTO語句
PL/SQL運(yùn)算符優(yōu)先級
PL/SQL觸發(fā)器
PL/SQL運(yùn)算符
PL/SQL教程
PL/SQL WHILE循環(huán)語句
PL/SQL面向?qū)ο?/span>
PL/SQL循環(huán)
PL/SQL邏輯運(yùn)算符
PL/SQL IF-THEN-ELSE語句
PL/SQL數(shù)據(jù)類型
PL/SQL環(huán)境安裝設(shè)置
PL/SQL游標(biāo)
PL/SQL基本循環(huán)語句
PL/SQL搜索CASE語句
PL/SQL常量和文字
PL/SQL嵌套循環(huán)

PL/SQL觸發(fā)器

觸發(fā)器是存儲程序,它會自動執(zhí)行或發(fā)射當(dāng)一些事件發(fā)生。觸發(fā)器,事實(shí)上,寫入響應(yīng)于以下任一事件將被執(zhí)行:

  • 數(shù)據(jù)庫操作(DML)語句(DELETE,INSERT,UPDATE或)

  • 數(shù)據(jù)庫定義(DDL)語句(CREATE,ALTER或DROP)

  • 數(shù)據(jù)庫操作(SERVERERROR,登錄,注銷,啟動或關(guān)機(jī))

觸發(fā)器可以在表,視圖,模式或數(shù)據(jù)庫與該事件相關(guān)聯(lián)上定義

觸發(fā)器的優(yōu)點(diǎn)

觸發(fā)器可以用于以下目的寫:

  • 自動生成一些派生列值

  • 實(shí)施參照完整性

  • 事件日志和對表的訪問存儲信息

  • 審計(jì)

  • 表的同步復(fù)制

  • 實(shí)行安全許可

  • 防止非法交易

創(chuàng)建觸發(fā)器

創(chuàng)建觸發(fā)器的語法:

CREATE [OR REPLACE ] TRIGGER trigger_name 
{BEFORE | AFTER | INSTEAD OF } 
{INSERT [OR] | UPDATE [OR] | DELETE} 
[OF col_name] 
ON table_name 
[REFERENCING OLD AS o NEW AS n] 
[FOR EACH ROW] 
WHEN (condition)  
DECLARE
   Declaration-statements
BEGIN 
   Executable-statements
EXCEPTION
   Exception-handling-statements
END;

那么,

  • CREATE [OR REPLACE] TRIGGER trigger_name: 創(chuàng)建或替換現(xiàn)有的觸發(fā)器:trigger_name

  • {BEFORE | AFTER | INSTEAD OF} : 指定當(dāng)觸發(fā)將被執(zhí)行。在INSTEAD OF子句用于在視圖中創(chuàng)建觸發(fā)器

  • {INSERT [OR] | UPDATE [OR] | DELETE}: 指定DML操作

  • [OF col_name]: 指定將被更新的列名

  • [ON table_name]: 指定觸發(fā)器相關(guān)聯(lián)的表的名稱

  • [REFERENCING OLD AS o NEW AS n]: 可以參考新舊值的各種DML語句,如INSERT,UPDATE和DELETE

  • [FOR EACH ROW]: 指定的行級觸發(fā)器,即觸發(fā)器將每一行受到影響執(zhí)行。否則,當(dāng)執(zhí)行SQL語句,這被稱為表級觸發(fā)器觸發(fā)將執(zhí)行一次

  • WHEN (condition): 觸發(fā)器將觸發(fā)的條件。此子句僅適用于行級觸發(fā)器有效

示例:

首先,將使用我們已經(jīng)創(chuàng)建,并在前面的章節(jié)中使用的CUSTOMERS表:

Select * from customers;

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
+----+----------+-----+-----------+----------+

下面的程序創(chuàng)建了customers表中,將觸發(fā)INSERT或UPDATE或DELETE在Customers表進(jìn)行操作的行級觸發(fā)。觸發(fā)器將顯示工資的舊值和新值之間的差額:

CREATE OR REPLACE TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON customers
FOR EACH ROW
WHEN (NEW.ID > 0)
DECLARE
   sal_diff number;
BEGIN
   sal_diff := :NEW.salary  - :OLD.salary;
   dbms_output.put_line('Old salary: ' || :OLD.salary);
   dbms_output.put_line('New salary: ' || :NEW.salary);
   dbms_output.put_line('Salary difference: ' || sal_diff);
END;
/

當(dāng)上述代碼在SQL提示符執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

Trigger created.

這里以下兩點(diǎn)是重要的,應(yīng)小心注意:

  • OLD和NEW引用是不可用于表級觸發(fā)器,而不可以使用它們的創(chuàng)紀(jì)錄級別的觸發(fā)器。

  • 如果想查詢表中相同的觸發(fā),那么應(yīng)用應(yīng)該使用AFTER關(guān)鍵字,因?yàn)橛|發(fā)器可以查詢該表,或再次改變它最初的變化僅適用后的表是回到一致的狀態(tài)。

  • 上述觸發(fā)已經(jīng)寫在這樣一種方式,它會在任何DELETE、INSERT或UPDATE操作在表上之前執(zhí)行,但可以奪觸發(fā)器上編寫一個或多個操作,例如BEFORE DELETE,這將會觸發(fā)每當(dāng)一個記錄將使用在表上刪除操作被刪除。

觸發(fā)一個觸發(fā)器

讓我們在CUSTOMERS表執(zhí)行某些DML操作。這里有一個INSERT語句,這將在表中創(chuàng)建一個新的記錄:

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Kriti', 22, 'HP', 7500.00 );

當(dāng)記錄在CUSTOMERS表中創(chuàng)建,上面創(chuàng)建觸發(fā)器display_salary_changes將被觸發(fā),它會顯示以下結(jié)果:

Old salary:
New salary: 7500
Salary difference:

因?yàn)檫@是一個新的記錄,因此基本工資不可用及以上的結(jié)果來為空(null)?,F(xiàn)在,讓我們對CUSTOMERS表進(jìn)行多一個DML操作。這里有一個UPDATE語句,該語句將更新表中現(xiàn)有的記錄:

UPDATE customers
SET salary = salary + 500
WHERE id = 2;

當(dāng)記錄在CUSTOMERS表更新,上面創(chuàng)建觸發(fā)器display_salary_changes將被觸發(fā),它會顯示以下結(jié)果:

Old salary: 1500
New salary: 2000
Salary difference: 500