SQL Server触发器
触发器概述
触发器是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是当某一事件发生时触发,例如当表执行deletet insert update时就会被执行。触发器是用来维护表数据的完整性
触发器分为:
1:after触发器(之后触发)
2:instead of 触发器 (之前触发)
触发器里有两章特殊的表插入表(instered表)和删除表(deleted表),这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
对表的操作 | Inserted逻辑表 | Deleted逻辑表 |
---|---|---|
增加记录(insert) | 存放增加的记录 | 无 |
删除记录(delete) | 无 | 无 |
修改记录(update) | 存放更新后的记录 | 存放更新前的记录 |
准备好两张表作为练习列子
Books表
字段 | 字段含义 | 字段类型 |
---|---|---|
ID) | 书籍编号,自增 | int |
Name | 书名 | nvarchar(50) |
TypeID | 书籍类型ID | int |
BookTypes表
字段 | 字段含义 | 字段类型 |
---|---|---|
ID | 类型编号,自增 | int |
Name | 类型名 | nvarchar(50) |
Nums | 该类型下书籍数量 | int |
after触发器
创建after触发器
after触发器是在对表进行操作之后触发的。创建新增触发器语句
需求:在新增书籍的时候,对应的类型表数据要更新
–创建触发器语法
–create trigger 触发器名称
– on 表名
– for 操作
–as 需要执行的sql语句
create trigger tgr_bookInsert
on [dbo].[Books]
for insert
as
–定义变量,存储新增书籍的类型ID
declare @typeID int
–定义变量存储书籍类型的数量
declare @typeNums int
–找到存储新增书籍的类型ID
select @typeID=typeID from inserted
–计算出对应书籍类型的数量
select @typeNums=count(*) from [dbo].[Books] where [email protected]
–更新BookTypes表
update [dbo].[BookTypes] set [email protected]
手动新增一个书籍分类,并且Nums为0
然后新增一本书
这个时候书籍分类的数量就会自动更新