Oracle触发器的类型及其应用(oracle触发器类型)

场景

触发器是Oracle的一种数据库对象,它随着DML语句(INSERT、UPDATE、DELETE)的执行而自动触发,它也可以捕获表中某些字段值的变化,响应该变化,用来自动实现数据完整性。Oracle提供了多种类型的触发器,如BEFORE 和AFTER触发器,其应用场景更为广泛,将有助于企业管理大型数据库。

Oracle的BEFORE触发器,用得最多的就是在针对特定表进行INSERT、UPDATE、DELETE操作之前,要对插入、更新、删除的数据作一定的前置检查。例如,在通过INSERT语句插入一行数据之前,检查插入的数据是否合法,例如我们可以检查被插入数据的特定字段的数据格式是否正确,满足特定要求。

下面情况是使用BEFORE 触发器的常见应用:

1、在插入或更新时禁止NULL值

例如:

CREATE OR REPLACE TRIGGER triggername 
BEFORE INSERT OR UPDATE
ON table_name
FOR EACH ROW
BEGIN
IF :NEW.COLUMN_NAME IS NULL THEN
RAISE_APPLICATION_ERROR(-20300, '不允许为空值!');
END IF;
END;

2、在插入或更新时,保证唯一性

例如:

CREATE OR REPLACE TRIGGER triggername
BEFORE INSERT OR UPDATE
ON table_name
FOR EACH ROW
BEGIN
SELECT COUNT(*) INTO num
FROM table_name
WHERE :NEW.col_name = col_name;

IF num > 0 THEN
RAISE_APPLICATOIN_ERROR(-20301,'无效的数据!');
END IF;
END;

AFTER触发器不像BEFORE触发器,它只能在操作发生后才执行,AFTER的触发器能够让我们能够访问到此次操作的所有影响行的数据,它也能够帮助我们实现一些复杂的业务需求。

下面是使用AFTER触发器常见应用:

1、针对某一列或行进行操作

例如:

CREATE OR REPLACE TRIGGER triggername 
AFTER INSERT OR UPDATE OR DELETE
ON table_name
FOR EACH ROW
BEGIN
IF INSERTING THEN
UPDATE table_name SET new_col = 'abc' WHERE col = :NEW.col;
END IF;
END;

2、创建一个历史表

例如:

CREATE OR REPLACE TRIGGER triggername 
AFTER INSERT OR UPDATE OR DELETE
ON table_name
FOR EACH ROW
BEGIN
IF INSERTING OR UPDATING THEN
INSERT INTO history_table VALUES (:OLD.col1,:OLD.col2, ..., old_version);
END IF;
END;

以上是Oracle触发器的简单介绍以及其相关应用场景,触发器可以帮助我们实现对数据的完整性控制,能够实现自动化管理,节省我们手动管理数据库中数据完整性的时间。


数据运维技术 » Oracle触发器的类型及其应用(oracle触发器类型)