平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“数据库触发器Trigger”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
从实现思路看,在数据库管理系统里,触发器(Trigger)是一种特殊的存储过程,它在特定的事件发生时自动执行。触发器通常用来维护数据的完整性和一致性。借助事件触发而被执行,不能直接调用。
触发器的三要素
触发事件 before/after(insert、update、delete)
触发条件 when
触发动作 begin ... end
触发器的分类
结合项目来看,根据触发时机和触发事件的不同,触发器能够分为以下几种类型:行级触发器与语句级触发器
在这个场景下,行级触发器(Row-Level Trigger)在每一行数据受到影响时触发,比如在插入、更新或删除某一行数据时。
结合项目来看,语句级触发器(Statement-Level Trigger)则在执行一条SQL语句时触发,无论该语句影响了多少行数据。
新建触发器
SQL> creagte trigger <触发器名> [{before | after}]
{[inster | delete | update of 列名列表] }
on 表名
[ referencing <临时视图名>]
[ when <触发条件>]
<触发动作>
end [触发器名]说明:
update: 指明是update触发器,每当update语句修改由of子句指定的列时,激发触发器。如果忽略of子句,每当update修改表的任意列值时,都将激发触发器。
从实现思路看,referencing <临时视图名>:指定临时视图别名,在触发器运行过程中,系统会生成另个临时视图分别存放被更新值旧值和新值(rollback用)。对于行级触发器,默认临时视图名分别为old和new;对于语句级触发器,默认临时视图名分别为old-table和new-table。
比如:
行级触发器
触发器中还能够回退修改采用rollback
SQL> create trigger bad_trg after update of balance on users
referencing new row as nrow, old row as orow
for each row
when nrow.balance < 0
begin
rollback
# 插入不良记录
insert into bads select concat(borrows.userid, convert(varchar(100), getdate(), 10)), borrows.userid, brid, getdate() from borrows when nrow.userid = borrows.userid and etime is null
end
语句级触发器
SQL> create trigger RAISE_LIMIT after update of SAL on EMP
referencing new table as n_tb, old table as o_tb
for each statement
when (800 > (select avg(SAL) from EMP)
begin
delete from EMP where ENO in ( select ENO from n_tb ) insert into EMP ( select * from o_tb )
end
修改触发器
SQL> alter trigger bad_trg after update on users
AS
BEGIN
-- 新的触发器逻辑
PRINT 'Employee record has been updated.'
-- 可以添加更多的逻辑,例如记录日志或执行其他操作
END
删除触发器
SQL> drop trigger bad_trg
到此这篇关于数据库触发器Trigger的文章就介绍到这了,更多相关数据库触发器Trigger内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!
- MySQL数据库 触发器 trigger
- 数据库触发器(Trigger)的一点采用心得
- MySQL借助触发器解决数据库中表的行数限制详解及实例
- 用sql脚本新建sqlserver数据库触发器范例语句