当前位置: 代码网 > it编程>数据库>MsSqlserver > 数据库触发器Trigger详解

数据库触发器Trigger详解

2025年05月19日 MsSqlserver 我要评论
在数据库管理系统中,触发器(trigger)是一种特殊的存储过程,它在特定的事件发生时自动执行。触发器通常用于维护数据的完整性和一致性。通过事件触发而被执行,不能直接调用。触发器的三要素触发事件 be

在数据库管理系统中,触发器(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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com