SQL触发器

本文详细介绍了数据库触发器的创建语法及使用方法,包括在INSERT、UPDATE、DELETE操作前后触发的不同情况,以及如何针对新旧数据进行操作。文章还解释了行级触发器的工作原理,并给出了具体的SQL示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法:

CREATE OR REPLACE TRIGGER '触发器名称'
AFTER/BEFORE INSERT OR UPDATE OR DELETE		-- 1
ON '表名'		-- 2
REFERENCING OLD ROW AS OLD NEW ROW AS NEW		-- 3
FOR EACH ROW		-- 4
BEGIN		-- 5
	--插入语句
	IF INSERTING THEN
		INSERT INTO 
			tablename (field1, field2, field3)
		VALUES
			(:NEW.field1, :NEW.field2, :NEW.field3);
	--更新语句
	ELSEIF UPDATING THEN
		UPDATE 
			tablename 
		SET
			field1 = :NEW.field1, field2 = :NEW.field2
		WHERE
			field3 = :OLD.field3;
	END IF;
	--删除语句
	IF DELETING THEN
		DELETE FROM 
			tablename 
		WHERE 
			field1 = :OLD.field1;
	END IF;
END;

1)、 AFTER / BEFORE:在语句执行之前还是执行之后
BEFOREINSERT / UPDATE 可以修改 NEW 数据
AFTER:不可以修改 NEW 数据
BEFOREAFTER 都不可以修改 OLD 数据
2)、 目的表名
3)、 为 OLD ROWNEW ROW 设置别名
4)、 行级触发器,每有一行数据发生变化,就执行一次触发器
5)、 NEW:只有 INSERT、UPDATE 语句才有
表示 新添加、更新后 的新数据
OLD:只有 UPDATE、DELETE 语句中才有
表示 更新前、删除前 前的旧数据
BEGIN ... END; 语句块中,使用 NEW、OLD 需要在前面加上冒号(:NEW、:OLD)

### SQL 触发器概述 SQL触发器是一种特殊的存储过程,在特定的数据库事件发生时自动执行。这些事件通常涉及对表的操作,如`INSERT`、`UPDATE`或`DELETE`。触发器可以在事件之前(`BEFORE`)或之后(`AFTER`)执行,并且可以针对每一行(`FOR EACH ROW`)单独处理[^2]。 ### 创建触发器的基本语法 创建触发器的标准SQL语法如下: ```sql CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN -- 触发器要执行的动作 END; ``` 对于某些数据库管理系统(DBMS),比如Oracle,还支持`INSTEAD OF`类型的触发器,用于视图上的操作[^4]。 ### 实际应用案例分析 #### 维护数据完整性 假设有一个员工信息表`employees`和一个部门信息表`departments`。每当向`employees`表中添加新记录时,希望自动更新对应部门的人数统计。这可以通过创建一个`AFTER INSERT`触发器来完成: ```sql CREATE OR REPLACE TRIGGER update_department_count_after_insert AFTER INSERT ON employees FOR EACH ROW BEGIN UPDATE departments SET num_of_employees = num_of_employees + 1 WHERE department_id = :new.department_id; END; / ``` 此代码片段展示了如何利用`:new`伪记录访问刚插入的新行中的值。 #### 审计日志功能 为了跟踪谁何时更改了哪些数据,可以设置触发器在每次更新某张表的时候写入一条新的审计记录到另一张专门的日志表里去。下面是一个简单的例子: ```sql CREATE TABLE audit_log ( id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(50), action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, affected_table VARCHAR(100), old_value TEXT, new_value TEXT ); DELIMITER // CREATE TRIGGER log_employee_changes AFTER UPDATE ON employees FOR EACH ROW BEGIN IF OLD.salary <> NEW.salary THEN INSERT INTO audit_log(user_name, affected_table, old_value, new_value) VALUES ('current_user', 'employees', CONCAT('Salary was ', OLD.salary), CONCAT('New salary is ', NEW.salary)); END IF; END;// DELIMITER ; ``` 这里使用了条件判断语句(IF...THEN...)仅当工资发生变化时才记录变更详情。 ### 注意事项与最佳实践 尽管触发器非常有用,但在实际开发过程中也需要注意一些潜在的风险点: - **性能开销**:频繁触发可能会给系统带来额外负载; - **调试难度较大**:由于其隐秘性质,出现问题不易定位原因; - **事务一致性**:需谨慎考虑触发动作是否应该参与当前事务还是独立运行; 因此建议开发者们合理规划触发器的设计方案,确保既能满足业务需求又不会引入不必要的复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

很简单_

点个赞在走呗 ~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值