灵活运用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的触发器,不仅可以按照自己的业务需求设计相应的逻辑,而且异常也可以在触发器中直接处理,可以更加灵活的运用触发器,让工作变得更加方便快捷。