Oracle触发器:深入了解不同类型(oracle触发器类型)
Oracle触发器是一个智能的对象,用于监视或记录用户和其他数据库对象的活动,以这种方式实现安全处理和自动执行事务。在Oracle数据库中,可以创建三种不同类型的触发器:表级触发器、行级触发器和数据库事件触发器。表级和行级触发器在某种程度上可以互换使用,但应根据特定的场景考虑创建一种或另一种类型的触发器。
表级触发器在表上创建,可以响应执行DDL或DML操作,如创建、更新、删除、插入或从表中获取数据等,它会在表中发生这些操作之前或之后发出信号,从而触发相关的程序或函数。表级触发器主要用于实现数据库安全处理,如更新记录前对其进行检查或自动生成日志记录。下面是一个示例,用于捕获通过DML操作更改数据的尝试。
CREATE OR REPLACE TRIGGER Trg_MyTable
BEFORE INSERT OR UPDATE OF ColumnName ON MyTable
FOR EACH ROW
BEGIN
IF UPDATING (‘ColumnName’) THEN
IF :NEW.ColumnName
RAISE_APPLICATION_ERROR(-20000, ‘ColumnName cannot have a negative value’);
END IF;
END;
而行级触发器则是实现行级逻辑的触发器,它可以直接对每行影响的数据进行处理。行级触发器可以在插入表行,更新和删除表行时触发。行级触发器可以用于防止用户提交不正确的数据,以及监视和报告数据更新等,这种方式可以有效节省DBA数据库管理中的时间花费。
示例:
CREATE OR REPLACE TRIGGER trg_employees
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF :NEW.salary
RAISE_APPLICATION_ERROR (-11560, ‘Invalid salary: ‘ || :NEW.salary);
END IF;
END;
/
最后,数据库事件触发器由Oracle数据库实例触发,而不是因表或行操作而触发的。数据库事件触发器可以在用户连接或断开连接,数据库实例中的任何状态发生变化,运行时发生可知情况,特定外部事件等时发出信号。对于数据库管理,可以创建一些事件触发器,用于监控记录实例的状态,如系统运行时间,CPU使用率,IO速率等,以此实现一些运维的实时监测和报告,维护系统的稳定性和可用性。
示例:
CREATE OR REPLACE TRIGGER monitor_user_login
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO LOGIN_AUDIT VALUES (
USER,
to_char(SYSDATE, ‘YYYY-MM-DD HH24:MI:SS’),
SYSDATE);
END;
/