触发器是Oracle数据库中可以自动执行任务的一种程序特性,可以在满足用户指定条件时自动触发执行一些SQL语句或PL/SQL块。Oracle触发器由触发器定义(也称为系统触发器)和触发器类型组成。触发器的类型可以用来实现各种常见的功能,如记录变更,实现业务规则等等。
### 表级触发器
表级触发器是Oracle提供的最常见的触发器类型,数据表的任何更改(包括行的插入,更新和删除)都会触发表级触发器。此类触发器可以基于数据变更记录日志,实现编码规则,以及使用数据库引擎而不是应用程序来实现数据一致性检查等。
例如,假设有一个数据表,用于存储每个员工的基本信息,包括员工ID,联系信息,部门ID等,为了确保数据的完整性,可以使用表级触发器来实现如下:
“`sql
CREATE OR REPLACE TRIGGER tr_before_employee_update
BEFORE UPDATE ON EMPLOYEE
FOR EACH ROW
BEGIN
IF :NEW.DEPT_ID IS NULL
THEN
RAISE_application_ERROR(-20000, ‘请输入部门ID!’);
END IF;
END;
/
该触发器将在用户尝试更新员工数据时触发,并在部门ID为空时引发错误。
### 行级触发器
行级触发器是一种比表级触发器更sophisticated的触发器,它们可以根据数据库表中每行的数据来触发不同的操作,而表级触发器只能基于整个表的操作来进行触发。此类触发器可以用于根据具体的行记录的数据内容来实现数据的一致性审查,以及实现业务规则等功能。
例如,假设有一个表,用于存储每个员工的工资信息,其中包括职位、工资等,为了确保可以通过行级触发器实现员工职位与工资的正确结合,可以使用行级触发器来实现如下:
```sql
CREATE OR REPLACE TRIGGER tr_before_salary_update
BEFORE UPDATE OF POSITION_ID ON SALARY
FOR EACH ROW
BEGIN
IF :NEW.POSITION_ID = 'Manager' AND :NEW.SALARY
THEN
RAISE_APPLICATION_ERROR(-20001, '经理职位的工资应大于5000元!');
END IF;
END;
/
该触发器将在用户尝试更新员工职位时触发,并在将职位设置为经理而工资低于5000元时引发错误。
### 其他类型触发器
Oracle也提供了一些其他触发器类型,如库级触发器(可以捕获在特定数据库实例中发生的所有表操作),系统事件触发器(可以在特定的系统事件发生时触发)等,可以根据实际需要来选择合适的触发器类型,以实现不同的常见功能。