2KB项目,专业的源码交易网站 帮助 收藏 每日签到

不同类型的 SQL Server 触发器

  • 时间:2019-01-23 18:41 编辑:2KB 来源:2KB.COM 阅读:371
  • 扫一扫,手机访问
  • 分享
摘要:
SQL Server 英文原文:Different Types of SQL Server Triggers

简介

触发器是数据库对象。基本上当一个和触发器相关的数据定义语言或者数据操纵语言命令语句被执行时,这些特别类型的存储过程就会自动执行。触发器被用在数据定义语言和数据操纵语言命令语句对数据修改之前或者之后评估数据。这也是用来保证数据完整性,以及控制服务器操作,审计服务器和实现业务逻辑或者业务规则。

触发器类型

在SQL Server中,我们可以创建4中类型的触发器- 数据定义语言触发器,数据操纵语言触发器, 通用语言运行时触发器和登录触发器。

1.数据定义语言触发器

在SQL Server中,我们能在数据定义语言语句(像CREATEALTERDROP)和某些系统定义的和数据定义语言类似的操作的存储过程上创建触发器。

例如:如果你将要执行CREATE LOGIN语句或者sp_addlogin存储过程来创建登录用户的话,那么这两个都会触发一个数据定义语言触发器,所以你可以在SQL Server上创建一个CREATE_LOGIN的事件。

我们可以在数据定义语言触发器中只能使用FOR/AFTER语句而不能是INSTEAD OF语句,也就是说在数据定义语言语句中我们只能使用AFTER触发器。

数据定义语言触发器可以在服务器端用来观察和控制事件的执行,以及审计这些操作。数据定义语言触发器可以用来管理管理员的事务如审计和校正数据库操作。

2. 数据操作语言触发器

在SQL Server中,我们可以在数据操作语言语句(像INSERT, UPDATE和DELETE)和像数据操作语言执行的操作的存储过程上创建触发器。数据操作语言触发器有两种类型:
1. After触发器(使用 FOR/AFTER语句)
这种类型的触发器在SQL Server成功执行完一些列操作之后才执行。

例如: 如果你在表中插入一行或者一条记录,那么这个触发器会在这个表的插入事件行通过了所有的约束如主键约束以及其它一些规则之后才会执行。如果这条记录/行插入失败了,那么SQL Server也不会执行After触发器。

2. Instead of 触发器(使用 INSTEAD OF语句)
这种类型的触发器会在SQL Server开始执行完一些列操作之前就执行。这是在这些操作执行后才执行的AFTER触发器的不同之处。我们可以在表上有一个INSTEAD OF insert/update/detele触发器,它会成功执行但是对表并不包含实际的insert/update/delete操作。

例如:如果你在表中插入一条记录或者一行,那么这个触发器会在这个表的插入事件行通过了所有的约束如主键约束以及其它一些规则之前就会执行。如果这条记录/行插入失败了,那么SQL Server也会执行Instead of触发器.

3. 通用语言运行时触发器

通用语言运行时触发器是建立在.NET框架的通用语言运行时之上的一类特殊的触发器。在SQL Server 2008就已经引进了集成通用语言运行时的触发器,并且允许触发器编码在任一一种.NET语言中如c#, Visual Basic和F#.

我们把这些像触发器之类的对象编码在通用语言运行时中,需要大量的计算或者需要引用SQL Server之外的对象。在通用语言运行时语言如像C#,Visual Basic和F#之类的的支持上我们可以为数据定义语言和数据操作语言触发器编写代码。我会在以后讨论通用语言运行时触发器。

4. 登录触发器

登录触发器是在SQL Server中当LOGON事件触发时执行的一类特殊的触发器。这个事件在当一个用户会话(session)在SQL Server完成了认证阶段之后建立而不是在用户会话已经实实在在建立之后时触发。所以,所有的我们在触发器中定义的信息如错误信息将会重新写入到SQL Server错误日志中。当认证失败时登录触发器不会执行。我们可以使用这些触发器来审计和控制服务器端的会话,例如跟踪登录活动或者对一个指定的登录限制会话数目。

登录触发器语法

CREATE TRIGGER trigger_name
ON ALL SERVER
[WITH ENCRYPTION]
{FOR|AFTER} LOGON
AS
sql_statement [1...n ] 

触发器语法

CREATE TRIGGER trigger_name
ON {table|view} 
[WITH ENCRYPTION|EXECUTE AS] 
{FOR|AFTER|INSTEAD OF} {[CREATE|ALTER|DROP|INSERT|UPDATE|DELETE ]} 
[NOT FOR REPLICATION] 
AS 
sql_statement [1...n ] 
1. trigger_name

这是触发器的名字,它应该遵守SQL Server中标识符规则。
2. table|view
触发器创建在这个表/视图上。
3. ENCRYPTION
这个选项是可选的。如果设置了这个选项,那么这个CREATE TRIGGER语句的原文本将会被加密。
4. EXECUTE AS
这个选项是可选的,这个选项设置了,那么这个触发器就会在安全上下文之下执行。
5. FOR/AFTER
FOR/AFTER指定了触发器是After触发器。如果只仅仅指定了FOR关键字,那么AFTER是默认的。AFTER触发器不能在视图上定义。
6. INSTEAD OF
INSTEAD OF指定了这个触发器是INSTEAD OF触发器
7.  CREATE|ALTER|DROP|INSERT|UPDATE|DELETE
这些关键字指定了哪个操作将在触发器中触发。可以使用这些关键字中的一个或者任何顺序的关键字组合。
8. NOT FOR REPLICATION
这个参数说明了这个触发器不会在响应进程修改表(即使)卷入了这个触发器中触发。
9. AS
在这个之后,我们可以指定触发器执行时的操作和条件
10. sql_statement
这些是触发器的条件和操作。这个触发器这些操作指定了在T-SQL语句之中。

注意

  1. 触发器的名字应该遵守标识符规则
  2. 数据操作语言触发器可以由任何T-SQL语句组成,除了CREATE DATABASE, ALTER DATABASE, DROP DATABASE, LOAD DATABASE, LOAD LOG, RECONFIGURE, RESTORE DATABASE, 和 RESTORE LOG语句。
  3. 你不能创建有悖于系统表或者动态管理视图的触发器,并且,TRUNCATE TABLE语句不会触发触发器,因为这个操作记录每行删除日志。
  4. 如果你使用了DATABASE选项,你的数据定义语言触发器的范围将会是当前这个数据库。如果你使用了ALL SERVER选项,那么你的数据定义语言触发器的范围将会是当前服务器。
  5. AFTER触发器不能在视图上定义。
  6. AFTER是默认的,如果指定了FOR关键字。

Summary

在这篇文章中,我努力解释SQL Server的触发器类型。我希望读了这篇文章之后,可以加强你的SQL触发器概念。我将会在下一篇文章中举例讨论所有这些触发器。我喜欢读了我的博客的读者能够反馈信息。请你发表关于本文的反馈,问题或者评论。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部