谈谈SQL Server触发器?

触发器分为前触发器(Instead Of )和后触发器(after)
前触发器就是在语句执行之前激活触发器,而后触发器就是在语句执行之后激活触发器。

触发器是一种特殊的存储过程,是由事件来触发某个操作,这些事件包括INSERT语句、UPDATE语句和DELETE语句。
当数据库系统执行这些事件时,会激活促发其执行相应的操作。触发器也可通过数据库中的相关表实现级联更改;
触发器的主要作用是,实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。他可以保证数据的正确性和逻辑,
比如订单表中新增一条数据,对应在库存表中会减少一个产品一样。
好处:
  自动执行
  相对于外部程序、存储过程,触发器可以更快更高效的维护数据
缺点:
  1.可移植性差;
   2.占用服务器资源,给服务器造成压力;
   3.执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度;
   4.嵌套调用一旦出现问题,排错困难,而且数据容易造成不一致,后期维护不方便。

在对表进行操作时,sql服务器会将操作的内容存放在临时inserted表和deleted表中,两张表存放的语句规则如下:
在这里插入图片描述

举例:
现有两张表:题目表和试卷表(有外键)
试卷表中每张试卷的总分由题目表中属于该试卷的题目分值的总和,当我新增一条题目数据时,执行触发器,自动再生成总分,然后更改给纸卷
表中,某张试卷的总分值。这时要有插入触发器。
同理当删除试题表中某条数据时,对应的那张试卷的总分也要更改
这时候可以在试题表中编写一个触发器
例:
添加一个插入数据的触发器:
USE [ExamDB]
GO
/****** Object: Trigger [dbo].[trigger_Topic_Insert] Script Date: 2021/5/13 15:38:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[trigger_Topic_Insert]
on [dbo].[Topic] – 指定创建触发器的表
after insert
as
declare @p_id int – 定义试卷的变量
declare @score int – 定义分值
declare @p_score int – 定义试卷表的分值字段
declare @p_Nums int – 定义试卷中插入试题数量

select @p_id=PaperID,@score=TopicScore from inserted – 在Inserted表中获取值

select @p_score=paperScore from Paper where PaperID=@p_id – 通过试卷id获取该试卷原来的总分
select @p_Nums=count(*) from Topic where PaperID=@p_id – 通过试卷id获取试题集中有多少该试卷试题

if (@p_score=0 and @p_Nums>0 ) – 如果试卷表的分值为0且试题表中有该试卷的试题
begin
declare @temp int – 定义一个变量保存该试卷出题的总分
select @temp=sum(TopicScore) from Topic where PaperID=@p_id – 获取总分
update Paper set PaperScore+=@temp where PaperID=@p_id – 修改试卷总分
end
else
update Paper set PaperScore+=@score where PaperID=@p_id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值