深入 Oracle 触发器的四种类型(oracle触发器类型)

Oracle 触发器(Trigger)是用户在数据库系统中定义的特定”特殊”操作,满足特定条件自动执行的SQL语句集,可以在数据库的一个特定的数据更新发生是自动执行。它可以实现数据的完整性、一致性及其他任务而无需人工干预。Oracle数据库支持四种类型的触发器,它们都使用下面的基本结构:

“`SQL

CREATE [OR REPLACE] TRIGGER trigger_name

{BEFORE | AFTER | INSTEAD OF}

{INSERT [OR] | UPDATE [OR] | DELETE}

[OF col_name]

ON table_name

[REFERENCING OLD AS OLD NEW AS NEW]

[FOR EACH ROW]

WHEN (condition)

[DECLARE

declaration_section]

BEGIN

executable_section

END;


即触发器的基本信息有:触发器类型(BEFORE | AFTER | INSTEAD OF)、触发事件(INSERT [OR] | UPDATE [OR] | DELETE)、对象(table_name)、变量(OLD AS OLD NEW AS NEW)。

第一种,BEFORE 触发器优先在数据库进行更新操作前执行,检查 更新语句中的参数是否有效,如果有效,可将请求授权并进行相应的数据修改。示例如下:

```SQL
CREATE OR REPLACE TRIGGER SAL_CHECK
BEFORE INSERT OR UPDATE OR DELETE
ON employees
FOR EACH ROW
DECLARE
tmp1 employees.salary%TYPE;
BEGIN
SELECT salary INTO tmp1
FROM employees
WHERE employee_id = :new.employee_id;
IF :new.salary
RAISE_APPLICATION_ERROR(-20099,
'Can''t give raise of more than 10%');
END;

第二种,AFTER 触发器总是在原语执行之后执行,一般用于更新系统数据,如改变和记录的值,示例如下:

“`SQL

CREATE OR REPLACE

TRIGGER SAL_UPDATE

AFTER UPDATE OR DELETE

ON hr.employees

FOR EACH ROW

BEGIN

UPDATE employees

SET salary_history = salary_history || ‘ ‘ ||

:new.salary

WHERE email = :old.email;

END;


第三种,INSTEAD OF 是变更由INSERT/UPDATE/DELETE语句本来要做的改变,一般用于view的语句,示例如下:

```SQL
CREATE OR REPLACE
TRIGGER EMP_Salary
INSTEAD OF DELETE
ON employee_view
FOR EACH ROW
BEGIN
UPDATE employee
SET salary = 0
WHERE employee_id = :old.employee_id;
END;

第四种,ROW 触发器,可以分别对每行数据进行操作,它可以用于插入、更新和删除操作,示例如下:

“`SQL

CREATE OR REPLACE

TRIGGER PR_UPDATE

BEFORE INSERT OR UPDATE

ON purchase_orders

FOR EACH ROW

BEGIN

UPDATE item

SET quantity_on_hand =

quantity_on_hand – :NEW.quantity

WHERE item_id = :NEW.item_id;

END;


以上就是介绍Oracle触发器的四种类型,每种类型都有自己的应用场景,也有其独特的应用领域,如要让系统正确更新表,在使用时,应该根据实际情况,使用对应的触发器来达到预期的功能和效果。

数据运维技术 » 深入 Oracle 触发器的四种类型(oracle触发器类型)