Oracle PL/SQL 触发器是数据库管理系统中一种强大的工具,用于扩展数据库的逻辑功能,实现复杂的业务规则和审计需求。它们在数据库操作背后默默工作,当特定的事件发生时自动执行,从而增强了数据的完整性和安全性。
1. **基本概念**
- **功能**:触发器的主要任务是弥补数据库完整性约束的不足,处理复杂的业务逻辑,并且可以用于监控数据库活动,实现审计跟踪。
- **类型**:DML触发器(Data Manipulation Language)响应INSERT、UPDATE或DELETE操作;INSTEAD OF触发器用于视图,替代实际DML操作;系统触发器则在执行DDL(Data Definition Language)语句、数据库启动或关闭等系统级别事件时触发。
- **触发事件**:这些事件对应于DML操作(INSERT, UPDATE, DELETE)或特定的系统事件。
- **触发条件**:通过WHEN子句定义触发条件,控制何时触发触发器。
- **触发对象**:可以关联到表、视图、模式或整个数据库。
- **触发操作**:触发器包含的PL/SQL代码会在满足条件时自动执行。
- **触发时机**:BEFORE或AFTER表示触发器在操作前或后执行。
- **触发子类型**:行级触发器针对每一行操作,语句级触发器在整个操作完成后执行。NEW和OLD表用于访问新值和旧值。
2. **创建触发器**
创建触发器使用`CREATE TRIGGER`语句,指定触发器名称、触发条件、触发时机和触发体(即PL/SQL代码块)。例如,以下示例创建了一个在尝试插入或更新名为'David'的教师时抛出错误的触发器:
```sql
CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT OR UPDATE OF TID, TNAME ON TEACHERS
FOR EACH ROW
WHEN (new.TNAME = 'David')
DECLARE
teacher_id TEACHERS.TID%TYPE;
INSERT_EXIST_TEACHER EXCEPTION;
BEGIN
SELECT TID INTO teacher_id FROM TEACHERS WHERE TNAME = new.TNAME;
RAISE INSERT_EXIST_TEACHER;
EXCEPTION
WHEN INSERT_EXIST_TEACHER THEN
INSERT INTO ERROR(TID, ERR) VALUES(teacher_id, 'the teacher already exists!');
END my_trigger;
```
3. **执行触发器**
触发器在用户执行相关DML操作时自动执行,无需显式调用。例如,以下触发器会在教师表上的INSERT、UPDATE或DELETE操作后记录操作类型:
```sql
CREATE TRIGGER my_trigger1
AFTER INSERT OR UPDATE OR DELETE ON TEACHERS
FOR EACH ROW
DECLARE
info CHAR(10);
BEGIN
IF inserting THEN
info := 'INSERT';
ELSIF updating THEN
info := 'Update';
ELSE
info := 'Delete';
END IF;
INSERT INTO SQL_INFO VALUES(info);
END my_trigger1;
```
4. **删除触发器**
要删除已创建的触发器,使用`DROP TRIGGER`语句,指定触发器的名称,例如:
```sql
DROP TRIGGER my_trigger;
```
Oracle PL/SQL触发器是数据库管理中的关键组件,它们允许开发者实现高级的业务逻辑和监控机制,确保数据的准确性和一致性。通过精心设计和使用触发器,可以增强数据库的灵活性和功能性,满足复杂的应用场景需求。