ORACLE PL/SQL 触发器编程篇介绍


在Oracle PL/SQL中,触发器(Trigger)是一种特殊类型的存储过程,它会自动执行(或触发)以响应数据库事件,如INSERT、UPDATE、DELETE等DML操作,或者DDL操作(如CREATE TABLE)和数据库系统事件(如登录或启动)。触发器可以在这些事件发生之前或之后自动执行定义的代码块,从而实现对数据库操作的自动控制和响应。

### 触发器的基本结构

一个基本的触发器结构包括触发时机(BEFORE或AFTER)、触发事件(如INSERT、UPDATE、DELETE)、触发对象(表或视图)、以及触发时执行的PL/SQL代码块。


CREATE OR REPLACE TRIGGER trigger_name
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON table_name
[FOR EACH ROW]
BEGIN
    -- 触发器逻辑
    NULL; -- 示例,实际应替换为具体逻辑
END;
/

- `BEFORE` 或 `AFTER` 指定了触发器是在事件之前还是之后执行。

- `INSERT`、`UPDATE`、`DELETE` 指定了触发事件。

- `ON table_name` 指定了触发器关联的表名。

- `FOR EACH ROW` 是可选的,用于指定触发器是否对受影响的每一行都执行一次。如果不指定,则触发器只对整个操作执行一次。

### 触发器的使用场景

1. **数据验证**:在数据插入或更新前检查数据的合法性。

2. **自动计算字段**:如自动更新时间戳字段。

3. **维护数据完整性**:确保数据库表之间的关系一致性。

4. **实施复杂的业务规则**:在数据变更时执行复杂的逻辑。

5. **审计和日志记录**:记录数据变更的历史。

### 注意事项

- 触发器可以嵌套,但过度使用或嵌套过深可能导致性能问题。

- 触发器中的错误处理需要特别注意,因为触发器通常是在用户不可见的背景下执行的。

- 触发器可能会隐藏数据的实际变更逻辑,使得数据库维护变得更加复杂。

### 示例

以下是一个简单的触发器示例,它在每次向`employees`表插入新记录时自动设置`created_at`字段的值为当前时间。


CREATE OR REPLACE TRIGGER trg_employees_before_insert
BEFORE INSERT
ON employees
FOR EACH ROW
BEGIN
    :NEW.created_at := SYSDATE; -- 使用SYSDATE函数获取当前时间
END;
/

在这个示例中,`:NEW`是一个特殊的伪记录,用于引用即将被插入的新行的列值。`SYSDATE`是Oracle提供的函数,用于获取当前的日期和时间。