触发器
以下以 MySQL 数据库为例,分别创建语句级触发器和行级触发器,并展示执行结果。假设我们有两个表,一个是 Employees
员工表,用于存储员工信息;另一个是 EmployeeAudit
审计表,用于记录员工信息的变动情况。
表结构定义
-- 创建员工表
CREATE TABLE Employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
salary DECIMAL(10, 2)
);
-- 创建审计表
CREATE TABLE EmployeeAudit (
audit_id INT PRIMARY KEY AUTO_INCREMENT,
employee_id INT,
change_type VARCHAR(20),
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
1. 语句级触发器示例
假设我们希望在每次对 Employees
表执行 UPDATE
操作后,在 EmployeeAudit
审计表中插入一条记录,记录此次更新操作。
-- 创建语句级触发器
DELIMITER //
CREATE TRIGGER after_employees_update_statement
AFTER UPDATE ON Employees
FOR EACH STATEMENT
BEGIN
INSERT INTO EmployeeAudit (employee_id, change_type)
VALUES (NULL, 'UPDATE_ALL');
END //
DELIMITER ;
插入测试数据
INSERT INTO Employees (name, salary) VALUES ('Alice', 5000.00);
INSERT INTO Employees (name, salary) VALUES ('Bob', 6000.00);
执行 UPDATE
语句并查看结果
-- 执行更新操作
UPDATE Employees SET salary = salary * 1.1 WHERE salary < 6000;
-- 查看审计表
SELECT * FROM EmployeeAudit;
执行结果:EmployeeAudit
表中会插入一条记录,因为不管 UPDATE
语句影响了多少行数据,语句级触发器只执行一次。
2. 行级触发器示例
我们还是在 Employees
表上创建触发器,当 Employees
表中的员工薪资发生更新时,在 EmployeeAudit
审计表中针对每一条被更新的员工记录插入一条变动记录。
-- 创建行级触发器
DELIMITER //
CREATE TRIGGER after_employees_update_row
AFTER UPDATE ON Employees
FOR EACH ROW
BEGIN
IF NEW.salary != OLD.salary THEN
INSERT INTO EmployeeAudit (employee_id, change_type)
VALUES (OLD.id, 'UPDATE_SALARY');
END IF;
END //
DELIMITER ;
再次执行 UPDATE
语句并查看结果
-- 执行更新操作
UPDATE Employees SET salary = salary * 1.1 WHERE salary < 6000;
-- 查看审计表
SELECT * FROM EmployeeAudit;
执行结果:假设上一次更新影响了 1 行数据,审计表中只有 1 条记录;而这次如果 UPDATE
语句影响了 2 行数据 ,EmployeeAudit
表中会插入两条记录,因为行级触发器针对每一条受影响的行都会执行一次。
知识补充:
增量数据(Delta Data)
指的是自上次处理或检查后,数据库中发生变化的数据,包括新增、修改、删除的数据。比如在数据仓库场景中,每天可能只需要抽取源数据库中当天新增或修改的记录(即增量数据)来更新数据仓库,而不是重新抽取全部数据,这样能大幅减少数据传输和处理量,提升效率。像基于时间戳来标识数据变化,通过对比时间戳筛选出增量数据。