深入 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 触发器优先在数据库进行更新操作前执行,检查 更新语句中的参数是否有效,如果有效,可将请求授权并进行相应的数据修改。示例如下:
```SQLCREATE OR REPLACE TRIGGER SAL_CHECK
BEFORE INSERT OR UPDATE OR DELETEON employees
FOR EACH ROWDECLARE
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的语句,示例如下:
```SQLCREATE OR REPLACE
TRIGGER EMP_SalaryINSTEAD OF DELETE
ON employee_viewFOR 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触发器的四种类型,每种类型都有自己的应用场景,也有其独特的应用领域,如要让系统正确更新表,在使用时,应该根据实际情况,使用对应的触发器来达到预期的功能和效果。