目录
1.触发器的定义
2.触发器的分类
3.dml触发器的工作原理
4.触发器的应用
准备数据
1.insert触发器
2.delete触发器
3.update 触发器补充:DDL触发器
5.触发器的启用和禁用
总结
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.触发器的应用
准备数据工欲善其事,必先利其器,(准备数据):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 ,'鲁迅') 创建触发器的格式: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触发器
创建触发器--判断数据库中,是否存在这个触发器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测试:insert into book values(8,'鹿鼎记','金庸',60)结果:
2.delete触发器
创建触发器: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;测试:delete from book where bid =1 select * from book_back
少了bid=1 的数据
book_back成功备份;3.update 触发器创建触发器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测试update book set bname ='金瓶梅' ,bauter='未知',bprice =12345 where bid =8结果:
补充:update列级更新需求,比如book的bid是主键 ,那就不能更改, 我们应该这么办呢?别急,我们可以用update()函数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 测试:update book set bid =1 select * from book
DDL触发器创建触发器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 测试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触发器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:SQL Server的触发器详解SQL SERVER触发器详解SQL Server的触发器你了解多少SQL Server的触发器详解利用SQL Server触发器实现表的历史修改痕迹记录SQLSERVER对加密的存储过程、视图、触发器进行解密(推荐) SQL Server 使用触发器(trigger)发送电子邮件步骤详解SQL Server:触发器实例详解SQL server 三种常用的触发器
