SQL Server高级查询之常见数据库对象(触发器)第五章节

1.触发器概述

触发器不是由程序调用的,也不是手工启动的,而是由事件来触发
每一个表只能创建一个instead of 触发器,但可以创建多个after触发器



2.SQL Server创建触发器语法如下

--trigger_name是触发器的名称
--tanle_name 是触发器放在哪张数据表内使用
--sql_statement 是触发器的主体代码
create trigger trigger_name on table_name
after | instead of delete | insert | update
as
sql_statement

3…inserted表和deleted表

SQL Server为每个触发器都创建了两张专用表:分别是
inserted表和deleted表
它们存在内存中而不是数据库中,当该触发器执行完成后,与该触发器相关的这两个表也被删除。(意思就是只有执行相应语句触发触发器的时候这两张表才会存在)

inserted表和deleted表的作用如下:
inserted表存放了insert和update(存放更新后的数据)要向表插入的所有行
deleted表存放了delete和update(存放更新前的数据)要从表删除的所有行

对数据的操作inserted表deleted表
insert添加操作存放新增的数据
update更新操作存放更新后的数据存放更新前的数据
delete删除操作存放删除的记录

4.instead of触发器和after触发器

SQL Server提供了两种触发器,分别是instead of触发器和after触发器。 这两种触发器的差别在于它们被激活时触发器代码的逻辑功能不同

1.instead of触发器特点
instead of 触发器用来代替通常的触发动作,既当对表进行insert、update或delete操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器内的主体代码,让触发器检查所进行的操作是否正确。如果正确才进行相应的操作 (说白了就是当进行insert、update或delete操作时,将insert、update或delete语句操作更换成instead of 触发器里面的主体代码执行)

做一个简单的例子以便复盘

--插入商品的团购价不能大于等于原价,如果超过则进行友善提示
-- 如若插入商品的团购价小于原价,则商品添加成功
if exists(select * from sysobjects where name='trigger_product') --如果这个触发器存在则删除这个触发器
	drop trigger trigger_product

GO

create trigger trigger_product on product instead of insert
as
declare @title varchar(50);		--用来接收刚插入到inserted表里面的数据
declare @originalPrice decimal;
declare @currentPrice decimal;
--执行insert语句时候,就会触发触发器,当触发触发器的时候,第一步会先将插入的语句放入inserted中,然后执行触发器里面的主体代码
select @title=title,@originalPrice=originalPrice,@currentPrice=currentPrice from inserted
if @currentPrice >= @originalPrice
begin
	print '团购价不能大于等于原价'
end
else
begin
	print '商品添加成功'
	insert product(title,originalPrice,currentPrice) values(@title,@originalPrice,@currentPrice)
end

GO
--执行插入语句时候会自动调用触发器的主体代码
insert product(title,originalPrice,currentPrice) values('小龙虾面',23,122)


2.after触发器特点

每一个表只能创建一个instead of 触发器,但可以创建多个after触发器
after触发器是执行insert、update或delete语句操作之后在执行的操作。比如某个表中的数据进行了更新操作后,要求立即对相关的表进行指定的操作,这时就可以采用after触发器。(说白了就是当进行insert、update或delete操作之后,触发器会自动触发从而执行after触发器里面的主体代码)

做一个简单的例子以便复盘

if exists(select * from sysobjects where name='trigger_insert')
   drop trigger trigger_insert
GO
--当插入一个订单时候,自动为订单详细表新增所下订单的产品
create trigger trigger_insert on ordersdetail after insert
as
declare @ordersID int ;		--获取订单编号
--执行insert语句时候,就会触发触发器,当触发触发器的时候,第一步会先将插入的语句放入inserted中,然后执行触发器里面的主体代码
select @ordersID=ordersID from inserted	
insert ordersdetail values(@ordersID,7,2)

GO
--执行插入语句时候会自动调用触发器的主体代码
insert orders(ordersID,customerID,ordersDate) values(20,4,'2020-9-20')
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值