触发器是一种特殊的存储过程,与存储过程不同的是存储过程通过调用名称来执行,而触发器的调用通过事件触发,自动调用执行。 例如:对表的增删改,如果定义了对应的触发器,载进行增删改时系统会自动调用
分类: DDL触发器:create,alter,drop DML触发器:insert,update,delete
- DML触发器又分为
- after触发器: inter,update,delete操作之后执行
- instead of触发器,insert,update,delete操作不执行,执行触发器中的内容
inserted deleted:插入表 删除表 两者都属于逻辑表,也就是虚表,系统在执行存储过程的时候,在内存中创建,只能读取,必能修改,结构与操作的表相同,触发器执行完成之后,这两个表自动删除
| 对表的操作 | inserted表 | deleted表 |
|---|---|---|
| insert | 存放插入的数据 | 无 |
| update | 存放更新后的数据 | 存放更新前的数据 |
| delete | 无 | 存放被删除的数据 |
inserted 存放插入或更新后的数据
deleted 存放更新前或删除的数据
触发器执行过程中,都是可以访问的,提交之前,可以撤销,类似于事务的回滚
触发器是一个特殊的事务,在操作数据库表的时候,设置一些条件,如果不满足可以回滚
1.after insertcreate trigger trigger_UserInfos_inserton UserInfosfor insert --也可以是after insertas--T-SQLdeclare @id int,@name varchar(50)select @id =UserId,@name=UserName from insertedprint convert(varchar,@id)+','+@name+"添加成功"go--触发trigger_UserInfos_insertinsert into UserInfos(UserName,UserPwd,DeptId,Age)values('lqq','123',2,23)2.after updatecreate trigger trigger_UserInfos_updateon UserInfosfor updateasdeclare @id int,@name varchar(50),@age intselect @id=UserId,@name=UserName,@age=Age from deletedprint '修改前:'+convert(varchar,@id)+','+@name+convert(varchar,@age)select @id=UserId,@name=UserName,@age=Age from insertedprint '修改后:'+convert(varchar,@id)+','+@name+convert(varchar,@age)select * into UserInfoBackup from deleted--将更新前的数据备份到新表、go--触发trigger_UserInfos_updateupdate UserInfos set UserName="lqq",Age=21where UserId =223.after deletecreate trigger trigger_UserInfos_deleteon UserInfofor deletedeclare @id int,@name varchar(50),@age intselect @id=UserId,@name=UserName,@age=Age from deletedprint '要删除的数据:'+convert(varchar,@id)+','+@name+convert(varchar,@age)--备份if(OBJECT_ID('UserInfoBackup','U') is not null)--目标表存在insert into UserInfoBackup select * from deletedelse--备份表不存在select * into UserinfoBackup from deletedprint "备份成功"go--触发delete from UserInfos where UserId = 22--标识列备份表不能用select *4.instead of insertcreate trigger trigger_UserInfos_insteadofon UserInfosinstead of insertasdeclare @id int,@name varchar(50),@age intselect @id=UserId,@name=UserName,@age=Age from insertedprint '要添加的数据:'+convert(varchar,@id)+','+@name+convert(varchar,@age)go--触发insert into UserInfos(UserName,UserPwd,Age,DeptId)values('lqq01','123',23,2)
after insert:在触发器中,标识列已经自动生成,且有值
instead of insert:在触发器中,标识列并未生成,没有值(0),触发器执行完毕后,要插入的数据并没有插入(插入语句不执行)
