灵活运用Oracle触发器类型让工作更便捷(oracle触发器类型)

在使用Oracle数据库时,Oracle提供的触发器类型有多种,可以根据不同的数据库业务需求使用不同的触发器类型。Oracle触发器类型有BEFORE、AFTER、INSTEAD OF等,覆盖了创建、更新、删除三种操作。针对应用的需求,看看具体的类型有什么优势,可以更灵活的运用这些类型带来更加便捷的工作。

BEFORE触发器,即在Java中的“拦截器执行前”,在这个触发器类型中,会在用户执行DDL或DML操作前,触发器会被触发,而不是在实际执行DML操作时触发,所以,如果在触发器中,有一个变量会在真正的DML影响的表中的数据之前做准备的话,用BEFORE 触发器最合适。示例如下:

“`sql

CREATE OR REPLACE TRIGGER Tri_Test

BEFORE

INSERT OR UPDATE OR DELETE

ON TABLE_TEST

FOR EACH ROW

DECLARE

TEMP NUMBER;

BEGIN

SELECT COUNT(*) INTO TEMP FROM TABLE_TEST WHERE ID = :new.ID;

IF TEMP > 0 THEN

RAISE_APPLICATION_ERROR(-20000, ‘该ID已存在’);

END IF;

END;

“`

AFTER触发器,即在Java中的“拦截器执行后”,该类型触发器在DDL或DML操作成功执行完成后,才会被触发,所以,如果有一些动作需要通知到用户,例如将做出的操作加入到日志表中,则可以使用AFTER触发器来处理。示例如下:

“`sql

CREATE OR REPLACE TRIGGER Tri_Test

AFTER

INSERT OR UPDATE OR DELETE

ON TABLE_TEST

FOR EACH ROW

BEGIN

IF INSERTING

THEN

INSERT INTO LOG_TABLE (ID,TYPE,DATE) VALUES (:NEW.ID,’INSERT’,SYSDATE);

ELSIF UPDATING

THEN

INSERT INTO LOG_TABLE (ID,TYPE,DATE) VALUES (:NEW.ID,’UPDATE’,SYSDATE);

ELSIF DELETING

THEN

INSERT INTO LOG_TABLE (ID,TYPE,DATE) VALUES (:OLD.ID,’DELETE’,SYSDATE);

END IF;

END;

“`

INSTEAD OF触发器,是比较特殊的一种,它是在触发DDL或DML操作之前,就先执行,由于它的特殊性,所以它只能被应用于视图,当我们针对视图执行插入、更新、删除操作时,可以使用INSTEAD OF触发器,来处理实际需要操作的表,而非操作的视图。示例如下:

“`sql

–创建视图

CREATE OR REPLACE VIEW TEST_V

AS

SELECT A.* FROM T_TEST_A A

UNION

SELECT B.* FROM T_TEST_B B

–创建触发器

CREATE OR REPLACE TRIGGER TRI_V

INSTEAD OF

DELETE

ON TEST_V

FOR EACH ROW

BEGIN

DELETE FROM T_TEST_A WHERE ID = :OLD.ID;

DELETE FROM T_TEST_B WHERE ID = :OLD.ID;

END;

总结而言,使用Oracle的触发器,不仅可以按照自己的业务需求设计相应的逻辑,而且异常也可以在触发器中直接处理,可以更加灵活的运用触发器,让工作变得更加方便快捷。

数据运维技术 » 灵活运用Oracle触发器类型让工作更便捷(oracle触发器类型)