1.触发器的定义
触发器其实就是一个特殊的存储过程,这个存储过程呢,不能调用罢了, 而是当数据发生变化的时候才触发了这个过程,;
2.触发器的分类
1) ,ddl触发器, 针对数据库的更新变化
主要是以create,drop,alter开头的语句的触发
2)dml触发器 这个针对表达数据更新
after |for 触发器(动作完成之后触发)
insert 触发器:
delete触发器
update触发器
3)登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
3.dml触发器的工作原理
在dml触发器执行过程中, 会产生两张临时表 inserted and deleted 在执行完毕后自动释放;
顺序 | insert触发器 | delete触发器 | update触发器 |
1 | 执行insert语句,在表中插入数据 | 执行delete语句,删除数据 |
执行update语句 ,修改数据 |
2 | 在临时表inserted中插入新数据的一个副本 | 在deleteed表中插入删除的数据的副本 |
a:首先备份要更新的数据,插入到deleted表中 b:备份完成后,将更新数据插入到inserted 表中 |
3 |
触发器对数据进行检验, 确定是否会滚或者其他操作 | 触发器对删除数据检查, 来执行其他操作 | 插入新的数据 |
4.触发器的应用
准备数据
工欲善其事,必先利其器,(准备数据):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | create table book ( bid int primary key not null , bname varchar (200) not null , bauther varchar (100) , bprice decimal (10,2) ) insert into book(bid,bname,bprice,bauther) values (1, '论语' ,25.6 , '孔子' ), (2, '天龙八部' ,25.6 , '金庸' ) , (3, '雪山飞狐' ,32.7 , '金庸' ), (4, '平凡的世' ,35.8 , '路遥' ) , (5, '史记' ,54.8 , '司马迁' ) , (6, '狂人日记' ,35.5 , '鲁迅' ) |
创建触发器的格式:
1 2 3 4 5 6 7 | CREATE TRIGGER trigger_name ON table_name [ WITH ENCRYPTION] --给触发器文本加密 FOR | after | instead of [ DELETE , INSERT , UPDATE ] ---多加一句after和for 是一个功能, 用一个就好了 AS T-SQL语句 GO |
[WITH ENCRYPTION] –给触发器文本加密
for 和after — 其实就是同一个功能,
instead of 就是执行某个操作之前
1.insert触发器
创建触发器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | --判断数据库中,是否存在这个触发器 IF (object_id( 'tr_insert_book' , 'tr' ) is not null ) drop trigger tr_insert_book go create trigger tr_insert_book on book instead of insert as begin declare @bid int ; select @bid = bid from inserted ; insert into books(bid) values (@bid); print '插入成功' ; end |
测试:
1 | insert into book values (8, '鹿鼎记' , '金庸' ,60) |
结果:
2.delete触发器
创建触发器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | IF(OBJECT_ID( 'TR_DELETE_BOOK' , 'TR' ) IS NOT NULL ) DROP TRIGGER TR_DELETE_BOOK GO CREATE trigger TR_DELETE_BOOK ON BOOK FOR DELETE AS BEGIN print '数据备份' ; if(object_id( 'book_back' , 'U' ) is not null ) insert into book_back select * from deleted; else select * into book_back from deleted; print '备份完成' end ; |
测试:
1 2 | delete from book where bid =1 select * from book_back |
少了bid=1 的数据
book_back成功备份;
3.update 触发器
创建触发器
1 2 3 4 5 6 7 8 9 10 11 12 | IF(OBJECT_ID( 'TR_UPDATE_BOOK' , 'TR' ) IS NOT NULL ) DROP TRIGGER TR_UPDATE_BOOK GO CREATE TRIGGER TR_UPDATE_BOOK ON BOOK AFTER UPDATE AS BEGIN waitfor delay '00:00:02' select * from book; END |
测试
1 | update book set bname = '金瓶梅' ,bauter= '未知' ,bprice =12345 where bid =8 |
结果:
补充:
update列级更新
需求, 比如book的bid是主键 ,那就不能更改, 我们应该这么办呢?
别急,我们可以用update()函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | IF(OBJECT_ID( 'TR_UPDATE1_BOOK' , 'TR' ) IS NOT NULL ) DROP TRIGGER TR_UPDATE1_BOOK GO create trigger TR_UPDATE1_BOOK on book instead of update as begin if( update (bid)) begin print '主键不能更改!!!!' ; rollback ; end end |
测试:
1 2 | update book set bid =1 select * from book |
DDL触发器
创建触发器
1 2 3 4 5 6 7 8 9 10 11 | IF(OBJECT_ID( 'TR_drop_BOOK' , 'TR' ) IS NOT NULL ) DROP TRIGGER TR_drop_BOOK GO create trigger TR_drop_BOOK on database instead of DROP_TABLE,ALTER_TABLE as begin print '别想着干坏事!!!!好好工作' rollback ; end |
测试
1 | drop table book |
结果
5.触发器的启用和禁用
dml触发器:
enable |disable trigger triger_name on table_name ;
ddl触发器:
enable | disable trigger triger_name on database;
总结
到此这篇关于sql server中的触发器用法的文章就介绍到这了,更多相关sql server触发器内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!