Trigger in oracle

本文介绍了PL/SQL触发器的基础概念及不同类型的触发器,包括行级触发器、语句级触发器、前触发器、后触发器及代替触发器等。详细解释了触发器如何在更新、插入或删除操作时被隐式触发。

Triggers are constructs in PL/SQL that need to be just created and associated with a table. Once they are created, when the table associated with it gets updated due to an UPDATE, INSERT or a DELETE, the triggers get implicitly fired depending upon the instructions passed to them

The types of triggers are:       

  • Row level triggers
  • Statement level triggers
  • BEFORE and AFTER triggers

The different types of triggers are:

  • Row triggers and statement triggers: specifies how many times the trigger should get executed – Once for every row or once for every triggering statement.
  • Before and after triggers – Before trigger is fired before and update, insert or triggering statement is executed. After trigger is fired after the triggering statement is executed.
  • Instead of Trigger- Here, the trigger is fired instead of executing the triggering statement
  • Key triggers – fired on some key action.
  • Mouse trigger- fired on some mouse navigation
  • Navigational trigger – fired as a result of some navigation.

The sequence of firing in a text item are as follows::

a) pre - text
b) when new item
c) key-next
d) when validate
e) post text.

 

 

<think>我们刚刚讨论的是关于Oracle数据库块内空间查看的问题,现在用户突然转向询问触发器相关信息。用户明确表示:“我想了解Oracle中触发器的相关信息 请问Oracle中触发器的介绍、使用方法和相关知识”,并提供了三条引用作为背景。 结合引用内容分析: - 引用[1]明确指出触发器是“由事件触发”的特殊存储过程 - 引用[2]给出了具体创建触发器的SQL示例(包括for each row语法) - 引用[3]虽然主要讲前端知识,但标题表明其包含触发器使用案例 需要构建结构化回答: 1. 首先定义触发器的本质(特殊PL/SQL程序) 2. 重点说明触发时机(DML/DDL/系统事件) 3. 详细解析语法结构(CREATE TRIGGER各子句) 4. 通过实际案例演示常见用法(如审计日志) 5. 强调关键注意事项(自治事务、变异表等限制) 特别注意用户上次询问的是空间管理,本次转向编程对象,需保持技术连贯性——在“存储过程”概念上建立关联(触发器本质是事件驱动的存储过程)。 回复需要包含示例代码(参考引用[2]的格式但更完整),同时生成相关问题引导深入学习。 </think>### Oracle 触发器详解 触发器是 Oracle 中**由事件自动触发**的特殊存储过程,用于实现数据操作的自动化控制与业务规则强制[^1]。以下是核心知识点: --- ### **一、触发器核心概念** | 特性 | 说明 | |------------------|----------------------------------------------------------------------| | **触发时机** | `BEFORE`(操作前)、`AFTER`(操作后)、`INSTEAD OF`(替代视图操作) | | **触发事件** | `INSERT/UPDATE/DELETE`(DML)、`CREATE/ALTER`(DDL)、数据库事件 | | **作用范围** | 行级触发器 (`FOR EACH ROW`)、语句级触发器 (默认) | | **特殊变量** | `:NEW`(新数据)、`:OLD`(旧数据),仅行级触发器可用[^2] | --- ### **二、创建语法解析** ```sql CREATE [OR REPLACE] TRIGGER trigger_name [BEFORE | AFTER | INSTEAD OF] [INSERT | UPDATE | DELETE] ON table_name [FOR EACH ROW] -- 指定行级触发器 [WHEN (condition)] -- 触发条件 DECLARE -- 变量声明 BEGIN -- PL/SQL 逻辑(可使用 :NEW/:OLD) EXCEPTION -- 异常处理 END; ``` > **关键点说明**: > - 行级触发器通过 `FOR EACH ROW` 启用,可访问 `:NEW.column` 和 `:OLD.column` > - `WHEN` 子句过滤触发条件,如 `WHEN (NEW.salary > 10000)` --- ### **三、实战案例演示** #### 案例1:审计订单修改(行级触发器) ```sql CREATE OR REPLACE TRIGGER audit_order_change BEFORE UPDATE ON orders FOR EACH ROW BEGIN INSERT INTO order_history(oid, sid, modify_date, old_buynum, new_buynum) VALUES (:OLD.oid, :OLD.sid, SYSDATE, :OLD.buynum, :NEW.buynum); DBMS_OUTPUT.PUT_LINE('订单 ' || :OLD.oid || ' 已修改'); -- 控制台输出[^2] END; / ``` > **效果**:更新 `orders` 表时自动记录变更历史到 `order_history` #### 案例2:禁止周末删除(语句级触发器) ```sql CREATE TRIGGER prevent_weekend_delete BEFORE DELETE ON employees BEGIN IF TO_CHAR(SYSDATE, 'DY') IN ('SAT', 'SUN') THEN RAISE_APPLICATION_ERROR(-20001, '周末禁止删除员工数据!'); END IF; END; / ``` --- ### **四、触发器核心机制** 1. **事务绑定** - 触发器与触发它的 DML 属于同一事务(提交/回滚同步) 2. **执行顺序** - `BEFORE` 触发器 → 约束检查 → DML 操作 → `AFTER` 触发器 3. **变异表限制** - **禁止在行级触发器中修改当前表**(如 `UPDATE orders` 中触发时不可再修改 `orders`) --- ### **五、最佳实践与陷阱规避** 1. **适用场景** - 审计日志、数据校验、派生列计算(如自动更新 `last_modified` 时间戳) 2. **性能风险** - 避免在频繁操作的表上创建复杂触发器(可能引发性能瓶颈) 3. **调试技巧** - 使用 `DBMS_OUTPUT.PUT_LINE` 输出调试信息[^2] - 查询 `USER_ERRORS` 视图获取编译错误详情 > ⚠️ **关键限制**:触发器内部**不支持 COMMIT/ROLLBACK**,需配合[自治事务](https://docs.oracle.com/database/121/LNPLS/autotrans.htm)实现独立事务控制 --- ### **相关问题** 1. 如何解决触发器导致的 "ORA-04091: 表正在发生变化" 错误? 2. 自治事务(Autonomous Transaction)在触发器中如何正确使用? 3. 如何监控和诊断触发器的执行性能? [^1]: Oracle 触发器语法解析与核心机制 [^2]: 行级触发器实战示例与调试技巧
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值