数据库触发器是一种特殊的数据库对象,它在数据库中的表上监视特定的事件(如插入、更新、删除等),并在这些事件发生时自动执行预定义的操作。触发器通常用于实施业务规则、数据完整性和一致性要求,以及记录日志和审计信息等场景。
实现原理
数据库触发器的实现原理基本如下:
- 事件监视: 触发器被绑定到表的特定事件上,如插入、更新或删除操作。
- 条件判断: 当表上的特定事件发生时,触发器会检查条件是否满足。
- 操作执行: 如果条件满足,触发器将执行预定义的操作,例如更新另一个表、插入数据到另一个表、发送邮件等。
实用场景
数据库触发器在许多场景中都非常有用,包括但不限于:
- 实施数据完整性: 当插入、更新或删除操作可能破坏数据完整性时,触发器可以用于检查并阻止这些操作。
- 审计和日志记录: 触发器可用于记录敏感操作,如谁在何时修改了数据。
- 派生数据: 可以使用触发器在一个表上的更改触发另一个表的更新。
- 业务规则实施: 触发器可用于强制实施业务规则,例如在特定条件下执行额外的操作。
示例
假设有一个简单的用户表users,我们希望在用户信息更新时记录变更日志。
-- 创建用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
-- 创建用户变更日志表
CREATE TABLE user_change_log (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
old_username VARCHAR(50),
new_username VARCHAR(50),
old_email VARCHAR(100),
new_email VARCHAR(100),
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 创建触发器
DELIMITER $$
CREATE TRIGGER after_user_update
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
IF OLD.username != NEW.username OR OLD.email != NEW.email THEN
INSERT INTO user_change_log (user_id, old_username, new_username, old_email, new_email)
VALUES (NEW.id, OLD.username, NEW.username, OLD.email, NEW.email);
END IF;
END$$
DELIMITER ;
当users表的记录更新时,触发器会检查用户名或邮箱是否发生变化,如果发生变化,则将变更记录插入user_change_log表中。