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的大同小异,只是语法上更艰 ...
随机推荐
- LGTM & code review
LGTM & code review LGTM is an acronym meaning looks good to me, frequently used when reviewing d ...
- rem & 16px & 62.5%
rem & 16px & 62.5% 浏览器的默认字体大小都是16px 兼容性:IE9+,Firefox.Chrome.Safari.Opera 的主流版本都支持了rem 对不支持的浏 ...
- array auto slice
array auto slice https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Ar ...
- nasm astrcmp函数 x86
xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export as ...
- uniapp vue mixin使用
这个mixin的翻版,主要用来分离处理列表数据逻辑 我用了覆写模式 创建mixin ListMoreDataMixin // 由于没有超类的限制这里要判断下 function ____checkGet ...
- Union international inc引进微信线下支付,开启消费无现金时代
长期以来,Union international inc娱乐集团(公司编号:20151533091)因其客户来自全球各国,特别是除了美国之外的中国用户居多,因此公司一直和中国领先的社交软件微信保持着良 ...
- 彻底解决Asp.netCore WebApi 3.1 跨域时的预检查204 options重复请求的问题
Asp.netCore WebApi 3.1 跨域的预检查options问题 1:我们直接使用core跨域的中间件 ,注入跨域服务, services.AddCors(options => { ...
- 验证销售部门的数据查看权限-脚本demo
1 # coding:utf-8 2 ''' 3 @file: run_old.py 4 @author: jingsheng hong 5 @ide: PyCharm 6 @createTime: ...
- git设置、查看、取消代理
设置代理: git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'sock ...
- 1086 Tree Traversals Again——PAT甲级真题
1086 Tree Traversals Again An inorder binary tree traversal can be implemented in a non-recursive wa ...
