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的大同小异,只是语法上更艰 ...
随机推荐
- 你不知道的 JS (系列丛书) - 第二版
你不知道的 JS (系列丛书) - 第二版 You Don't Know JS (book series) - 2nd Edition https://github.com/learning-js-b ...
- 1 line of CSS Layouts
1 line of CSS Layouts 10 modern layouts in 1 line of CSS 1. 绝对居中布局 <div class="container&quo ...
- git tag All In One
git tag All In One $ git tag --help # (cedec380)在指定的分支上打 tag $ git tag -a stable-version-1.1.1 cedec ...
- bash for mac
bash for mac https://sourabhbajaj.com/mac-setup/iTerm/ https://sourabhbajaj.com/mac-setup/iTerm/zsh. ...
- GitHub 500 error
GitHub 500 error 无法访问了, GitHub 挂了又! error reports Downdetector Github down? Current service status a ...
- asm movbe 指令
movbe MOVBE 目标操作数,源操作数 复制源操作数的数据,交换字节后,移动数据 假如: movbe eax,(float)1000.0 eax == 0x00007A44 movbe eax, ...
- 「NGK每日快讯」12.21日NGK第48期官方快讯!
- JAVA 批量下载服务器文件到本地指定文件夹并重命名
/** * @功能 下载文件到指定文件夹并重命名 * @param url 请求的路径 * @param filePath 文件将要保存的目录 * @param filename 保存到本地的文件名 ...
- python进阶(12)闭包
闭包 首先了解一下:如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用 ...
- How DRI and DRM Work
How DRI and DRM Work Introduction This page is intended as an introduction to what DRI and DRM are, ...