oracle创建触发器
时间: 2025-06-12 15:21:07 浏览: 14
### Oracle 数据库触发器的创建与语法
在 Oracle 数据库中,触发器是一种特殊的存储过程,它会在特定事件发生时自动执行。以下是创建触发器的完整语法和示例:
#### 触发器的基本语法
```sql
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF}
{event_type}
ON {schema_name.}table_name
[REFERENCING {OLD AS old_name | NEW AS new_name}]
[FOR EACH ROW]
[WHEN condition]
DECLARE
-- 声明变量(可选)
BEGIN
-- 触发器逻辑
END;
/
```
- `trigger_name`:触发器的名称。
- `{BEFORE | AFTER | INSTEAD OF}`:指定触发器是在事件之前、之后还是替代事件执行[^1]。
- `{event_type}`:触发事件类型,例如 `INSERT`, `UPDATE`, 或 `DELETE`[^2]。
- `ON {schema_name.}table_name`:触发器关联的表或视图。
- `[FOR EACH ROW]`:指定触发器是语句级触发器还是行级触发器。如果省略,则为语句级触发器;如果包含,则为行级触发器[^3]。
#### 示例 1:创建一个行级触发器
以下示例展示了一个行级触发器,在每次插入数据到 `employees` 表时记录日志。
```sql
CREATE OR REPLACE TRIGGER log_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_logs (employee_id, action, log_date)
VALUES (:NEW.employee_id, 'Inserted', SYSDATE);
END;
/
```
在此示例中,`:NEW` 是 Oracle 提供的一个伪记录,用于访问新插入的行的数据。
#### 示例 2:创建一个语句级触发器
以下示例展示了一个语句级触发器,在每次更新 `departments` 表时记录操作。
```sql
CREATE OR REPLACE TRIGGER log_department_update
AFTER UPDATE ON departments
BEGIN
INSERT INTO department_logs (action, log_date)
VALUES ('Updated', SYSDATE);
END;
/
```
此触发器仅记录整个语句的操作,而不针对每一行单独记录[^2]。
#### 示例 3:创建一个 INSTEAD OF 触发器
以下示例展示了一个 INSTEAD OF 触发器,用于处理对视图的插入操作。
```sql
CREATE OR REPLACE TRIGGER instead_of_view_insert
INSTEAD OF INSERT ON employee_view
FOR EACH ROW
BEGIN
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (:NEW.employee_id, :NEW.first_name, :NEW.last_name);
END;
/
```
INSTEAD OF 触发器通常用于视图上,因为视图可能不支持直接的 DML 操作[^1]。
#### 注意事项
- 触发器不能显式调用,只能通过满足触发条件由数据库自动调用[^2]。
- 触发器可以是行级或语句级,具体取决于是否使用 `FOR EACH ROW` 子句。
- 在行级触发器中,可以使用 `:NEW` 和 `:OLD` 引用新旧值。
阅读全文
相关推荐

















