Oracle数据库触发器详解:自动化数据操作与业务逻辑,提升代码可维护性
发布时间: 2024-07-25 09:42:07 阅读量: 32 订阅数: 25
Oracle中触发器示例详解
![Oracle数据库触发器详解:自动化数据操作与业务逻辑,提升代码可维护性](https://worktile.com/kb/wp-content/uploads/2022/09/43845.jpg)
# 1. Oracle触发器概述
Oracle触发器是一种数据库对象,当数据库中特定事件发生时自动执行一组SQL语句或PL/SQL代码。触发器用于在数据操作或数据库结构更改时执行特定的业务逻辑或数据操作。
触发器由两个主要部分组成:触发器声明和触发器主体。触发器声明指定触发器的名称、事件类型和触发器将执行的表。触发器主体包含触发器执行的SQL或PL/SQL代码。
触发器可以用于各种目的,包括:
* 验证和约束数据
* 审计和记录数据变更
* 自动化复杂操作
* 增强数据安全性
# 2. 触发器类型与工作原理
触发器是Oracle数据库中的一种特殊机制,允许用户在对表进行特定操作(例如插入、更新或删除)时执行自定义代码。触发器可以用于各种目的,例如数据验证、数据审计和业务逻辑自动化。
### 2.1 DML触发器
DML(数据操作语言)触发器在执行DML操作(插入、更新或删除)时被激活。它们可以用来验证数据、执行业务规则或执行其他操作。
#### 2.1.1 INSERT触发器
INSERT触发器在向表中插入新行时被激活。它们可以用来验证插入的数据是否有效,或者执行其他操作,例如计算派生列或执行级联更新。
```sql
CREATE OR REPLACE TRIGGER insert_trigger
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
-- 验证插入的数据
IF :NEW.salary < 10000 THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary must be greater than or equal to 10000');
END IF;
-- 计算派生列
:NEW.commission := :NEW.salary * 0.1;
END;
```
#### 2.1.2 UPDATE触发器
UPDATE触发器在更新表中的现有行时被激活。它们可以用来验证更新的数据是否有效,或者执行其他操作,例如记录更新历史或执行级联更新。
```sql
CREATE OR REPLACE TRIGGER update_trigger
BEFORE UPDATE ON my_table
FOR EACH ROW
BEGIN
-- 验证更新的数据
IF :NEW.salary < 10000 THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary must be greater than or equal to 10000');
END IF;
-- 记录更新历史
INSERT INTO update_history (table_name, row_id, old_value, new_value)
VALUES ('my_table', :OLD.row_id, :OLD.salary, :NEW.salary);
END;
```
#### 2.1.3 DELETE触发器
DELETE触发器在从表中删除行时被激活。它们可以用来验证删除操作是否有效,或者执行其他操作,例如记录删除历史或执行级联删除。
```sql
CREATE OR REPLACE TRIGGER delete_trigger
BEFORE DELETE ON my_table
FOR EACH ROW
BEGIN
-- 验证删除操作
IF :OLD.is_active = 1 THEN
RAISE_APPLICATION_ERROR(-20002, 'Cannot delete active rows');
END IF;
-- 记录删除历史
INSERT INTO delete_history (table_name, row_id, deleted_at)
VALUES ('my_table', :OLD.row_id, SYSDATE);
END;
```
### 2.2 DDL触发器
DDL(数据定义语言)触发器在执行DDL操作(例如创建、修改或删除表)时被激活。它们可以用来执行各种任务,例如维护表之间的关系或执行数据迁移。
#### 2.2.1 CREATE触发器
CREATE触发器在创建新表时被激活。它们可以用来创建其他表或对象,或者执行其他操作,例如初始化表数据。
```sql
CREATE OR REPLACE TRIGGER create_trigger
AFTER CREATE ON my_table
FOR EACH STATEMENT
BEGIN
-- 创建另一个表
EXECUTE IMMEDIATE 'CREATE TABLE my_table_audit (LIKE my_table)';
-- 初始化表数据
INSERT INTO my_table_audit SELECT * FROM my_table;
END;
```
#### 2.2.2 ALTER触发器
ALTER触发器在修改现有表时被激活。它们可以用来更新表结构或执行其他操作,例如重新计算表统计信息。
```sql
CREATE OR REPLACE TRIGGER alter_trigger
AFTER ALTER ON my_table
FOR EACH STATEMENT
BEGIN
-- 更新表统计信息
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(user, 'my_table');
END;
```
#### 2.2.3 DROP触发器
DROP触发器在删除现有表时被激活。它们可以用来删除其他表或对象,或者执行其他操作,例如清理数据。
```sql
CREATE OR REP
```
0
0