SqlServer触发器的创建与使用
前言
上期我们介绍了SqlServer的视图和存储过程创建与使用,这期我们介绍一下触发器。
有需要回顾的可以电梯直达看一下:
触发器的定义
触发器(Trigger)是针对某个表或视图所编写的特殊存储过程,它不能被显式地调用,
而是当该表或视图中的数据发生添加INSERT、更新UPDATE或删除DELETE等事件时自动被执行。
主要作用是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。

触发器的作用
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,
它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。
触发器的主要作用主要有以下接个方面:
- 强制数据库间的引用完整性;
- 级联修改数据库中所有相关的表,自动触发其它与之相关的操作;
- 跟踪变化,撤销或回滚违法操作,防止非法修改数据;
- 返回自定义的错误消息,约束无法返回信息,而触发器可以;
- 触发器可以调用更多的存储过程;
触发器的优点
- 触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
- 触发器可以通过数据库中的相关表进行层叠修改。
- 触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。
触发器的缺点
- 增加了系统的复杂性。
- 嵌套触发器容易出现死锁现象。
- 触发器并没有提升多少性能。
- 可移植性差。
- 占用服务器资源,给服务器造成压力。
- 复杂的触发器维护困难。
触发器的分类
SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。
DML触发器
如果用户要通过数据操作语言 (DML) 事件编辑数据,则执行 DML 触发器。
DML 事件是针对表或视图的 INSERT、UPDATE 或 DELETE 语句。
在激发任何有效的事件时,将会激发这些触发器,而无论是否会影响任何表行。
当数据库服务器中发生数据操作语言事件时执行这些操作。
SqlServer中的DML触发器有三种:
- insert触发器:向表中插入数据时被触发;
- delete触发器:从表中删除数据时被触发;
- update触发器:修改表中数据时被触发。
当遇到下列情形时,应考虑使用DML触发器:
1. 通过数据库中的相关表实现级联更改
2. 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。
3. 评估数据修改前后表的状态,并根据该差异才去措施。
DDL触发器
DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,
使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。
登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。
与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。
因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。
如果身份验证失败,将不激发登录触发器。
触发器的种类

after触发器(之后触发)
在执行 INSERT、UPDATE、MERGE 或 DELETE 语句的操作之后执行 AFTER 触发器。
如果违反了约束,则永远不会执行 AFTER 触发器;因此,这些触发器不能用于任何可能防止违反约束的处理。
对于在 MERGE 语句中指定的每个 INSERT、UPDATE 或 DELETE 操作,将为每个 DML 操作触发相应的触发器。
instead of 触发器
INSTEAD OF触发器替代下列触发语句的标准操作。
因此,触发器可用于对一个或多个列执行错误或值检查,然后在插入、更新或删除行之前执行其他操作。
INSTEAD OF触发器的主要优点是可以使不能更新的视图支持更新。
INSTEAD OF触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部分成功的同时拒绝批处理中的某些部分。
下表对 AFTER 触发器和 INSTEAD OF 触发器的功能进行了比较。

Transact-SQL DDL 触发器
用于执行一个或多个 Transact-SQL 语句以响应服务器范围或数据库范围事件的一种特殊类型的 Transact-SQL 存储过程。
例如,如果执行某个语句(如 ALTER SERVER CONFIGURATION)或者使用 DROP TABLE 删除某个表,则激发 DDL 触发器。
CLR DDL 触发器
CLR 触发器将执行在托管代码(在 .NET Framework 中创建并在 Transact-SQL 中上载的程序集的成员)中编写的方法,而不用执行 SQL Server存储过程。
使用T-SQL语句来增删查改触发器
创建触发器
--创建一个触发器
--检测到表数据有update时,更新CreateTime时间为当前时间
create trigger trigger_a_Students --触发器名称
on a_Students for update
as
begin
update a_Students SET CreateTime=GETDATE() --触发器需要执行的sql
end --测试
--执行一个修改语句
update a_Students
set Name='孙悟空1'
where Number=100001 --查看数据
select * from a_Students
删除触发器
--删除触发器
drop trigger trigger_a_Students --触发器名称
查询触发器
--查看所有触发器
select * from sysobjects where xtype='TR' -- 查看单个触发器
exec sp_helptext 'trigger_a_Students' --触发器名称
修改触发器
--修改一个触发器
--检测到表数据有update,insert时,更新CreateTime时间为当前时间
alter trigger trigger_a_Students --触发器名称
on a_Students for update,insert
as
begin
update a_Students SET CreateTime=GETDATE() --触发器需要执行的sql
end --测试
--执行一个插入语句
INSERT INTO a_Students(Number,Name,ClassId)
VALUES('100016','李靖',3) --查看数据
select * from a_Students
好了,我们就介绍到这里吧,
拜拜,我们下次不见不散。
![]() 欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取
作者:熊泽-学习中的苦与乐 公众号:熊泽有话说 出处:https://www.cnblogs.com/xiongze520/p/14606862.html 创作不易,任何人或团体、机构全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。 |
SqlServer触发器的创建与使用的更多相关文章
- SqlServer游标的创建与使用
前言 大家都对SqlServer视图.存储过程.触发器的创建与使用有一定的了解了,我们来看下什么是游标,怎么使用,什么时候用. SqlServer视图的创建与使用 SqlServer存储过程的创建与使 ...
- SQLServer触发器创建、删除、修改、查看
一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束. 二: SQL Server为每个触发器 ...
- SQLServer触发器创建、删除、修改、查看示例代码
一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束. 二: SQL Server为每个触发 ...
- 一次SQLSERVER触发器编写感悟
背景:BOSS须要我写一个工厂採集端到server端的数据同步触发器,数据库採用的是sqlserver2008 需求:将多台採集机的数据同步到server中,假设採集端数据库与server数据库连接失 ...
- SqlServer 使用脚本创建分发服务及事务复制的可更新订阅
原文:SqlServer 使用脚本创建分发服务及事务复制的可更新订阅 [创建使用本地分发服务器] /************************[使用本地分发服务器配置发布]*********** ...
- SQLServer触发器
触发器的作用: 自动化操作,减少了手动操作以及出错的几率. 触发器是一种特殊类型的存储过程,它不同于前面介绍过的一般的存储过程. [在SQL内部把触发器看做是存储过程但是不能传递参数] 一般的存储过程 ...
- Oracle数据库——触发器的创建与应用
一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...
- SQLServer触发器的使用
创建: create trigger trigger_name on {table_name view_name} {for After Instead of } [ insert, update,d ...
- mysql存储过程、函数和触发器的创建 [转]
http://blog.itpub.net/559237/viewspace-438942/ 今天花了半天时间来研究mysql的存储过程函数和触发器的创建,觉得和oracle的大同小异,只是语法上更艰 ...
随机推荐
- reStructuredText(.rst) && read the docs
Read the Docs && reStructuredText (.rst) && markdown 1. github master 分支,创建 docs ...
- CSS3 优先级
CSS3 优先级 https://developer.mozilla.org/zh-CN/docs/Web/CSS/Specificity 优先级 在本文章中 概念 优先级是如何计算的? 选择器 ...
- JavaScript this All In One
JavaScript this All In One js, this, bind, call, apply, new, function, arrow function, constructor f ...
- egg.js in action
egg.js in action fullstack https://github.com/eggjs/egg/ cli config router service midlewares HTTP C ...
- 「NGK每日快讯」2021.2.7日NGK公链第96期官方快讯!
- SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程01---搭建前端工程
豆宝社区项目实战教程简介 本项目实战教程配有免费视频教程,配套代码完全开源.手把手从零开始搭建一个目前应用最广泛的Springboot+Vue前后端分离多用户社区项目.本项目难度适中,为便于大家学习, ...
- Python 装饰器原理剖析
以下内容仅用于帮助个人理解装饰器这个概念,案例可能并不准确. 什么是装饰器? 我们知道iPhone 应用商店中有成千上万的APP,我们也知道苹果系统每年都会大版本更新增加很多新功能.这些功能要想发挥出 ...
- 运用Spock编写高质量单元测试
单元测试作为提升代码质量的有效方法,目前在国内各大互联网公司的开发团队中,尤其是业务团队中却鲜少被使用.这主要由于大家对于单元测试有一些认知错误,或者没有正确的打开方式.至今我们团队在小剧场.零代码运 ...
- Mysql训练:where后不可以进行聚合函数的判断,而having可以进行聚合函数的判断
力扣题目:查找重复的电子邮箱 编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱. +----+---------+ | Id | Email | +----+---------+ | ...
- 如何读写拥有命名空间xmlns 属性的Xml文件(C#实现)
我们在进行C#项目Xml读写开发时经常遇到一些读写问题,今天我要介绍的是遇到多个命名空间xmlns属性时如何读写此类文件. 比如下面这个Xml文件: <?xml version="1. ...
