SqlServer 触发器 详细讲解
什么是触发器
触发器是一个在修改指定表值的数据时执行的存储过程,不同的是执行存储过程要使用EXEC语句来调用,而触发器执行不需要使用EXEC语句来调用,通过创建触发器可以保证不同表的逻辑相关数据的引用完整性或一致性。
优点
1、触发器是自动的
2、触发器可以通过数据库相关表进行层叠更改。
3、触发器可以强制限制。
触发器的作用
触发器的主要作用就是能够实现主键和外键所不能保证的复杂的参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,能够提供比CHECK约束更复杂的数据完整性,并自定义错误。触发器的主要作用由以下几个方面。
1、强制数据库间的引用完整性。
2、级联修改数据库中所有相关表,自动触发与其他与之相关的操作。
3、跟踪变化,撤销或者回滚违法操作,防止非法修改数据。
4、返回自定义错误信息,约束无法返回信息,而触发器可以。
5、触发器可以调用更多的存储过程。
触发器分类
1、数据库操作语言触发器(Data Manipulation Language,DML)触发器。
附加在表或视图上,主要有三种INSERT触发器、UPDATE触发器、DELETE触发器
2、数据定义语言(Data Definition Language,DDL)触发器。
主要用于当前服务器或者数据库中。
创建DML触发器
首先先创建两张表
CREATE TABLE [dbo].[Stu]([ID] [int] IDENTITY(1,1) NOT NULL,--自增长ID[Name] [varchar](50) NOT NULL,--学生姓名[subject] [varchar](50) NOT NULL,--学科[credit] [decimal](18, 2) NOT NULL--单科学分)
GOCREATE TABLE [dbo].[Stu_sum]([Name] [varchar](50) NULL,--学生姓名[number] [int] NULL--总学分
)
GO
现在有一张学生单科成绩表和一个成绩汇总表
INSERT触发器
要求插入一个学生单科成绩,并把分数汇总到Stu_sum 表中,根据学生的姓名(这里做测试没有做其他约束)
CREATE TRIGGER dbo.stu_TRIGGER_INSERTON dbo.StuAFTER INSERT
AS
BEGINSET NOCOUNT ON;--不返回影响行数--插入数据时会产生INSERTED表(表结构和Stu一样)--把[Stu_sum]存在的数据先更新掉update b set b.number=isnull(b.number,0)+a.credit from (select [Name],sum(credit) credit from INSERTED group by [Name]) ajoin [dbo].[Stu_sum] b on a.Name=b.Name--把不存在的添加进[Stu_sum]INSERT into [dbo].[Stu_sum](Name,number)select a.Name,a.creditfrom (select [Name],sum(credit) credit from INSERTED group by [Name]) aleft join [dbo].[Stu_sum] b on a.Name=b.Namewhere b.Name is null
END
GO
首先插入一条数据
insert into [dbo].[Stu]([Name],[subject],[credit]) values('张三','数学',100),('张三','英语',100)
查询结果,如下图Stu_Sum表中
select * from [Stu]
select * from [Stu_sum]
DELETE触发器
先插入几条值
insert into [dbo].[Stu]([Name],[subject],[credit]) values('张三','体育',60),('李四','英语',100),('李四','语文',80)
先查询一下表看一下表目前的值
目标删除张三的体育成绩,同时更新张三的总成绩。
DELETE触发器创建
CREATE TRIGGER dbo.stu_TRIGGER_DELETEON dbo.StuAFTER DELETE
AS
BEGINSET NOCOUNT ON;--不返回影响行数--删除数据时会产生DELETEED表(表结构和Stu一样)--把[Stu_sum]存在的数据更新掉update b set b.number=isnull(b.number,0)-a.credit from (select [Name],sum(credit) credit from DELETED group by [Name]) ajoin [dbo].[Stu_sum] b on a.Name=b.Name
END
GO
执行删除语句
delete from [dbo].[Stu] where Name='张三' and subject='体育'
查看结果
UPDATE触发器
案例:需要把张三数学改成98分,同时修改张三总成绩
创建UPDATE触发器
CREATE TRIGGER dbo.stu_TRIGGER_UPDATEON dbo.StuAFTER UPDATE
AS
BEGINSET NOCOUNT ON;--不返回影响行数--更新数据时会产生INSERTED 、DELETEED表(表结构和Stu一样)--把[Stu_sum]存在的数据更新掉update b set b.number=isnull(b.number,0)+d.credit from (select Name,sum(credit) credit from(select a.[Name],b.credit-a.credit credit from DELETED a join INSERTED b on a.ID=b.ID) c group by [name]) djoin [dbo].[Stu_sum] b on d.Name=b.Name
END
GO
执行语句
update [dbo].[Stu] set [credit]=98 where [Name]='张三' and [subject]='数学'
查看结果
替代触发器
与前面介绍了三种AFTER触发器不同,SQLServer 服务器在执行触发AFTER触发器的SQL代码后,先建立临时的INSERTED和DELETED表,然后执行SQL代码中对数据的操作,最后才激活触发器中的代码。而对于替代(INSTEAD OF)触发器,SQL SERVER服务器执行触发INSERTAD OF 触发器时,先建立临时的INSERTED和DELETED表,然后直接触发INSTEAD OF 触发器。
案例:当用户插入学生单科成绩大于100分时,直接提示报错。
创建触发器
CREATE TRIGGER dbo.stu_TRIGGER_INSTEADOFON dbo.StuINstead of INSERT
AS
BEGINif exists(select ID from inserted where credit>100)beginselect '插入成绩错误' as 错误原因end
END
GO
执行插入语句
insert into [dbo].[Stu]([Name],[subject],[credit]) values('张三','体育',130)
执行结果,错误的成绩没有被插入。
SqlServer 触发器 详细讲解相关推荐
- SQL Server 触发器 详细讲解
最近在做微信活动,需要用到存储过程,在网上找了下感觉使用触发器更好些,和大家分享下 希望对你有用. 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动 ...
- delphi7存取配置文件与sqlserver数据库连接_SQL Server基础知识概念要点详细讲解
SQL Server基础知识概念要点详细讲解 目录 基础概念 1.网状模型数据库 2.层次模型数据库 3.关系模型数据库 知识点实例总结 基础概念 SQL语言中,between and表示包括两边参数 ...
- 【数据库】以sqlserver数据库为例,讲解sql语句的修改列(万字长文详细讲解)
本文针对数据库的初学者,进行详细讲解,通过更改.添加.除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义. 一 语法 ALTER TABLE table { [ ALTER COLUMN c ...
- SQL Server基础知识概念要点详细讲解
SQL Server基础知识概念要点详细讲解 目录 基础概念 1.网状模型数据库 2.层次模型数据库 3.关系模型数据库 知识点实例总结 基础概念 SQL语言中,between and表示包括两边参数 ...
- Mysql学习总结(10)——MySql触发器使用讲解
2019独角兽企业重金招聘Python工程师标准>>> 触发器(TRIGGER)是由事件来触发某个操作.这些事件包括INSERT语句.UPDATE语句和DELETE语句.当数据库系统 ...
- mybatis-plus超详细讲解
(6条消息) mybatis-plus超详细讲解_zdsg45的博客-CSDN博客_mybatis-plushttps://blog.csdn.net/zdsg45/article/details/1 ...
- Spring Cloud详细讲解
Spring Cloud详细讲解 一.微服务架构4个核心问题 1.服务很多,客户端该怎么访问? 2.这么多服务服务之间如何通信? 3.这么多服务,如何治理? 4.服务挂了怎么办? 解决方案: Spri ...
- 适合新手练手,用Python爬取OPGG里英雄联盟英雄胜率及选取率,详细讲解加注释(建议收藏练手)
今天来个简单的小项目,适合新手拿来练手,在OPGG上爬取英雄联盟里的法师,ADC,打野,辅助所有英雄的胜率及选取率,是不是感觉很高大上,但是却很简单,只要用三十多行代码就能实现,详细讲解每一行代码加注 ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
最新文章
- ActiveMQ—Queue与Topic区别
- java 读取url https_如何获取URL链接是http还是https
- shell下function报错
- winform 在panel怎么实现锚点定位_高德网络定位之“移动WiFi识别”
- Intellij IDEA常用配置详解
- 小于n与n互质的所有数的和(欧拉函数+快速幂)
- 火了这么久的 AI,现在怎么样了?
- 【字符集UTF8】处理Toad显示乱码及Windows XP下无法插入“某些汉字”问题
- eclipsejvm内存不足_Eclipse无法调试及编译时内存不足的解决
- mac mail 删除邮件服务器,如何从Mac OS X中的邮件中删除所有电子邮件 | MOS86
- youcans 的 OpenCV 学习课—4.图像的叠加与混合
- 要让玩家买单的facebook中文网
- sql server 迁移 mysql_sql server 迁移到 mysql
- Android开发,你应该知道的
- 查询数据进行排名,一样的并列
- 个人业务网站php源码,最新个人发卡网源码,PHP运营级个人自动发卡平台完整源码...
- 网站克隆工具-httrack安装使用教程
- Spring中FrameMaker中文乱码
- 新能源车牌识别SDK核心算法不断更新
- 期货市场倒挂什么意思(期货市场倒挂什么意思啊)