学习笔记----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书籍类型IDint

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 typeID=@typeID
	--更新BookTypes表
	update [dbo].[BookTypes] set Nums=@typeNums

手动新增一个书籍分类,并且Nums为0
在这里插入图片描述

然后新增一本书
在这里插入图片描述

这个时候书籍分类的数量就会自动更新
在这里插入图片描述

instead of 触发器

instead of是在对表操作之前触发的

模拟需求:删除BookTypes表其Books表的对应的书籍类型也要删除

创建instead of触发器

create trigger tgr_deleteBookType
on [dbo].[BookTypes]
instead of delete
as
	--定义变量,存储删除类型ID
    declare @typeID int
	select @typeID = id from deleted
	--删除类型之前删除对应的书籍
	delete from [dbo].[Books] where TypeID=@typeID
	--删除书籍后再删除类型
	delete from [dbo].[BookTypes] where id=@typeID

执行sql语句删除我们刚刚新增的书籍类型及书籍

delete from [dbo].[BookTypes] where id=4

在这里插入图片描述

对应的书籍类型记录已被删除

在这里插入图片描述

书籍类型下的书籍也被删除了

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值