33.1 触发器概述
记录并审核用户对表中数据的修改操作,实现审计功能;
实现比检查约束更复杂的完整性约束,例如禁止非业务时间的数据操作;
实现某种业务逻辑,例如增加或删除员工时自动更新部门中的人数;
同步实时地复制表中的数据。
触发器会增加数据库结构的复杂度,而且触发器对应用程序不可见,难以调试;
触发器需要占用更多的数据库服务器资源,尽量使用数据库提供的非空、唯一、检查约束等;
触发器不能接收参数,只能基于当前的触发对象进行操作。
33.2 创建触发器
CREATE TRIGGER trigger_name
{ BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON table_name FOR EACH ROW
trigger_body;
CREATE TABLE emp_salary_audit (
audit_id INTEGER NOT NULL AUTO_INCREMENT
emp_id INTEGER NOT NULL,
old_salary NUMERIC(8,2) NULL,
new_salary NUMERIC(8,2) NULL,
change_date TIMESTAMP NOT NULL,
change_by VARCHAR(50) NOT NULL,
CONSTRAINT pk_emp_salary_audit PRIMARY KEY (audit_id));
DELIMITER $$CREATE TRIGGER tri_audit_salary AFTER UPDATE ON employee FOR EACH ROWBEGIN
-- 当月薪改变时,记录审计数据
IF (NEW.salary <> OLD.salary) THEN
INSERT INTO salary_audit (emp_id, old_salary, new_salary, change_date, change_by)
VALUES(OLD.emp_id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP, USER());
END IF;END$$DELIMITER ;
UPDATE employeeSET email = 'sunqian@shuguo.net'WHERE emp_name = '孙乾';
UPDATE employeeSET salary = salary * 1.1WHERE emp_name = '孙乾';
SELECT *FROM salary_audit;audit_id|emp_id|old_salary|new_salary|change_date |change_by|--------|------|----------|----------|-------------------|---------|
1| 25| 4700| 5170|2019-10-18 10:16:36|TONY |
CREATE TRIGGER trigger_name
{ BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON table_name FOR EACH ROW
{ FOLLOWS | PRECEDES } other_trigger
trigger_body;
33.3 查看触发器
SHOW TRIGGERS [{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
mysql> show triggers\G*************************** 1. row ***************************
Trigger: tri_audit_salary
Event: UPDATE
Table: employee
Statement: BEGIN
-- 当月薪改变时,记录审计数据
IF (NEW.salary <> OLD.salary) THEN
INSERT INTO salary_audit (emp_id, old_salary, new_salary, change_date, change_by)
VALUES(OLD.emp_id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP, USER());
END IF;END
Timing: AFTER
Created: 2020-10-06 21:50:02.47
sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION Definer: root@localhostcharacter_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci1 row in set (0.00 sec)
mysql> SHOW CREATE TRIGGER tri_audit_salary\G*************************** 1. row ***************************
Trigger: tri_audit_salary
sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONSQL Original Statement: CREATE DEFINER=`root`@`localhost` TRIGGER `tri_audit_salary` AFTER UPDATE ON `employee` FOR EACH ROW BEGIN
-- 当月薪改变时,记录审计数据
IF (NEW.salary <> OLD.salary) THEN
INSERT INTO salary_audit (emp_id, old_salary, new_salary, change_date, change_by)
VALUES(OLD.emp_id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP, USER());
END IF;END
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci
Created: 2020-10-06 21:50:02.471 row in set (0.00 sec)
33.4 删除触发器
DROP TRIGGER IF EXISTS tri_audit_salary;