瞭解 Oracle 触发器的種類與功能(oracle触发器类型)

Oracle 触发器是在資料庫中一種非常有用的工具,它擁有與存儲過程類似的功能,但它使發生的變化可以在對結構沒有影響的情況下,用於在資料庫基架中實現特定任務。触发器可分為四種類型,分別用來執行不同類型的觸發任務。

首先是表触发器,它是用於更改表格資料的最常用触发器類型,使得在插入,更新或刪除表格資料時,可以對其進行嚴格控制。 下面是一個簡單的 CREATE TABLE 語法示例,其中包括在 BEFORE INSERT 觸發器中實現:

CREATE TABLE trigger_example

(

ID INTEGER NOT NULL,

Name VARCHAR2(100)

);

CREATE OR REPLACE TRIGGER trig_before_insert

BEFORE INSERT ON trigger_example

FOR EACH ROW

BEGIN

IF :NEW.ID IS NULL THEN

RAISE_APPLICATION_ERROR(-20001, ‘ID 必須為非空值’);

END IF;

END;

作用於表格上的第二種觸發器類型是變數觸發器,它主要用於協助監測特定值的變化及其影響。舉例來說,在某個變數上定義觸發器可以做這樣的事情:當某個特定的變量發生變化時,確保應用程序中的某個邏輯模塊立即停止執行。舉例來說,下面是一個通過使用 BEFORE STATEMENT 觸發器來實現的示例:

CREATE OR REPLACE TRIGGER trig_stop_module

BEFORE STATEMENT

ON trigger_example

FOR UPDATE OF ID

BEGIN

IF (:OLD.ID

RAISE_APPLICATION_ERROR(-20001, ‘ID 不可逆轉’);

END IF;

END;

該觸發器確保,只要對 ID 變數進行更新操作,如果新值小於老值,則不允許更新操作。另一種觸發器類型是系統觸發器,它主要用於在執行特定的操作時發送系統消息,這些消息可以幫助系統管理員瞭解發生什麼樣的操作。一個對 ADMINISTER DATABASE LINk 操作執行 before DDL 觸發器的示例如下所示:

CREATE OR REPLACE TRIGGER trig_sys_message

BEFORE DDL

ON database

BEGIN

DBMS_OUTPUT.PUT_LINE(‘Database operation detected; operation details : ‘);

DBMS_OUTPUT.PUT_LINE(:OLD.DBMS_SQL.V_STRING);

END;

此外,還有一種類型被稱為游標觸發器。它主要用於初始化預定行程,並實現一些極其複雜的操作,例如用於將數據庫 row 拆分為不同表的操作。下面是一個改變表格數據的簡單循環語句:

DECLARE

cur_exam dbms_sql.v_cursor;

c_row INT := 0;

BEGIN

OPEN cur_exam FOR ‘SELECT * FROM trigger_example’;

LOOP

FETCH cur_exam INTO c_row;

EXIT WHEN dbms_sql.END_OF_FETCH;

IF c_row > 10 THEN

UPDATE trigger_example

SET ID = 0

WHERE CURRENT OF cur_exam;

END IF;

END LOOP;

END;

總結起來,Oracle 觸發器可提供多種不同類型的功能,有助於增強對資料庫數據的控制。它們確保可以避免一些主動攻擊或人為失誤,如果按照程序指定要求來使用,則可以得到非常可觀的結果。


数据运维技术 » 瞭解 Oracle 触发器的種類與功能(oracle触发器类型)