Oracle入门(十四.19)之触发器简介

一、触发器的需求

让我们从一个例子开始吧:一条业务规则规定,只要员工的工资发生变化,变更就必须记录在日志记录表中。
可以创建两个过程来执行此操作:

UPD_EMP_SAL更新工资,LOG_SAL_CHANGE将行插入日志表。可以从UPD_EMP_SAL中调用LOG_SAL_CHANGE,或者从调用环境中分别调用LOG_SAL_CHANGE。

但不必这样做。 相反,你创建一个触发器。 下一张幻灯片展示了如何。

一个简单的触发器的例子

从现在起,无论何时SQL语句更新薪水,该触发器都会自动执行,并将该行插入到日志表中。

CREATE OR REPLACE TRIGGER log_sal_change_trigg
AFTER UPDATE OF salary ON employees
BEGIN
 INSERT INTO log_table (user_id, logon_date)
 VALUES (USER, SYSDATE);
END;
说触发事件(更新工资)发生时触发器会自动触发(即执行)。 原因和结果:事件发生,触发器触发。


二、什么是触发器?

(1)数据库触发器:
•PL / SQL块是否与特定操作(事件)相关联,例如用户成功登录或对数据库对象(如表或视图)执行的操作
•每当发生相关操作时自动执行

•存储在数据库中在上一张幻灯片的示例中,触发器与此操作相关联:UPDATE OF salary ON employees


(2)应用程序与数据库触发器比较

无论何时在架构或数据库中发生数据事件(例如DML或DDL)或系统事件(例如连接用户或DBA关闭数据库),数据库触发器都会自动执行。 数据库触发器就像PL / SQL过程,函数和包一样被创建并存储在数据库中。 应用程序触发器在应用程序中发生特定事件时自动执行。 应用程序触发器广泛用于使用Oracle Forms Developer开发的应用程序。

(3)哪些事件会导致数据库触发器触发?

数据库中的以下事件可能导致触发器触发:
•表上的DML操作
•视图上的DML操作,带有INSTEAD OF触发器
•DDL语句,例如CREATE和ALTER

•数据库系统事件,例如用户登录或DBA关闭数据库时

(4)触发器的可能用途
可以使用触发器来:
•增强复杂的数据库安全规则
•自动创建审计记录
•执行复杂的数据完整性规则
•自动创建日志记录
•防止桌子意外掉落

•防止发生无效的DML交易

•自动生成派生列值
•维护同步表复制
•收集表访问统计信息

•在针对视图发布DML语句时修改表格数据


示例1:自动创建记录记录

数据库管理员想要在数据库中保存一个自动记录(在数据库表中),以及何时登录。 他/她可以创建日志表和合适的触发器,如下所示:

CREATE TABLE log_table (
 user_id VARCHAR2(30),
 logon_date DATE);
CREATE OR REPLACE TRIGGER logon_trigg
AFTER LOGON ON DATABASE
BEGIN
 INSERT INTO log_table (user_id, logon_date) VALUES (USER, SYSDATE);
END;
示例2:执行复杂的数据完整性规则

设想一条规则,规定员工的工作不能改变成员工过去已经完成的工作。

CREATE OR REPLACE TRIGGER check_sal_trigg
BEFORE UPDATE OF job_id ON employees
FOR EACH ROW
DECLARE
 v_job_count INTEGER;
BEGIN
 SELECT COUNT(*) INTO v_job_count
     FROM job_history
     WHERE employee_id = :OLD.employee_id  AND job_id = :NEW.job_id;
 IF v_job_count > 0 THEN
     RAISE_APPLICATION_ERROR(-20201,'This employee has already done this job');
 END IF;
END;


三、触发指南

不要将触发器定义为复制或替换您可以通过其他方式轻松完成的操作。 例如,使用约束实现简单的数据完整性规则,而不是触发器。过度使用触发器会导致复杂的相互依赖关系,这可能难以维护。 仅在必要时使用触发器,并注意递归和级联效应。

通过创建在触发器主体中调用的存储过程或打包过程来避免冗长的触发器逻辑。


数据库触发器和存储过程的比较




猜你喜欢

转载自blog.csdn.net/moakun/article/details/80535302