### Oracle Trigger 概述 #### 6.1 触发器的类型 ##### 6.1.1 DML 触发器 DML (Data Manipulation Language) 触发器是一种特殊的触发器类型,它会在特定的数据操纵语言操作(如 INSERT、UPDATE 或 DELETE)执行时被激活。DML 触发器可以设定为在这些操作之前或者之后执行,并且可以在行级(即每条受影响的记录)或语句级(即整个SQL语句)上触发。 **特点**: - **激活时机**:可以在数据插入、更新或删除操作之前或之后触发。 - **级别**:支持行级触发器(针对每一条受影响的记录触发)和语句级触发器(仅当执行完整个SQL语句时触发)。 - **用途**:用于实施复杂的业务规则、数据完整性约束、审计需求等。 **示例**: - **创建示例**: - 表结构:`CREATE TABLE major_stats (major VARCHAR2(30), total_credits NUMBER, total_students NUMBER);` - 触发器定义:`CREATE OR REPLACE TRIGGER UpdateMajorStats AFTER INSERT OR DELETE OR UPDATE ON students ...` - 这个触发器会在`students`表上的任何DML操作后自动运行。 - 功能:保持`major_stats`表中的数据始终是最新的,反映`students`表中更改的情况。 **实现细节**: - **触发器逻辑**: ```sql DECLARE CURSOR c_Statistics IS SELECT major, COUNT(*) total_students, SUM(current_credits) total_credits FROM students GROUP BY major; BEGIN -- 首先清除`major_stats`表中的所有数据,确保数据的准确性。 DELETE FROM major_stats; -- 对每个专业重新计算统计数据,并将其插入到`major_stats`表中。 FOR v_StatsRecord IN c_Statistics LOOP INSERT INTO major_stats (major, total_credits, total_students) VALUES (v_StatsRecord.major, v_StatsRecord.total_credits, v_StatsRecord.total_students); END LOOP; END; ``` - **作用**: - 维护复杂的数据完整性限制:例如,确保表中的统计数据始终与实际情况相符。 - 审计追踪:记录表中数据的变化情况,便于审计或监控。 - 自动化流程:当数据发生变化时,自动触发其他应用程序执行相应处理。 ### 替代触发器 (Instead Of Triggers) 替代触发器是一种特殊类型的触发器,它通常与视图关联。当对视图执行DML操作时,如果视图基于多个表或包含复杂的计算字段,则可以直接在视图上定义替代触发器来代替对底层表的实际操作。 **特点**: - **激活条件**:当对视图执行DML操作时激活。 - **作用**:替代对底层表的直接操作,提供更高级别的数据处理逻辑。 **示例**: - 创建一个视图,然后为其定义一个替代触发器,该触发器在更新视图时执行复杂的业务逻辑。 ### 系统触发器 (System Triggers) 系统触发器是在系统级事件发生时被激活的触发器。这类触发器可以响应诸如数据库启动、关闭等事件,也可以响应DDL(Data Definition Language)操作,如创建、修改或删除数据库对象。 **特点**: - **激活事件**:数据库启动、关闭或DDL操作。 - **用途**:自动化系统级别的任务,比如记录系统日志、执行定期备份等。 **示例**: - **数据库启动触发器**:在数据库启动时自动运行的触发器,可以用来初始化系统配置或执行必要的预启动检查。 ### 触发器的创建与管理 创建触发器的基本语法如下: ```sql CREATE [OR REPLACE] TRIGGER trigger_name [BEFORE | AFTER | INSTEAD OF] {INSERT | UPDATE | DELETE | TRUNCATE} [FOR EACH ROW] [WHEN (condition)] ``` **示例**: - 创建一个简单的行级触发器,用于记录用户登录时间: ```sql CREATE OR REPLACE TRIGGER log_login BEFORE INSERT ON users FOR EACH ROW BEGIN :new.login_time := SYSDATE; END; ``` ### 总结 触发器是Oracle数据库中非常强大的工具,用于实现自动化的业务逻辑处理、数据完整性控制等功能。理解不同类型的触发器及其应用场景对于高效管理和维护数据库至关重要。通过合理的触发器设计,可以大大简化复杂的应用程序逻辑,提高系统的可靠性和安全性。
剩余33页未读,继续阅读
- Seavean2013-08-05相当不错,给我这个触发器新手很好的指导。
- xzy092013-03-29东西整理的挺好 很不错!
- 鬼902013-01-23教程很详细,但是我的表操作不起来,遗憾。
- 粉丝: 300
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助