学习笔记----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 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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40052237/article/details/106211417
今日推荐