触发器

触发器的一些常见作用:
强制参照完整性:虽然本书建议尽可能使用声明参照完整性(DRI),但是DRI也有很多不能实现的操作(例如,跨数据库或服务器的参照完整性以及许多复杂的关系类型等)。
创建审计跟踪:这意味着写出的记录不仅跟踪大多数当前的数据,还包括对某个记录进行实际修改的历史数据。随着SQL Server 2008中的更改数据跟踪功能的出现,创建审计跟踪最总可能不会再那么流行,但触发器仍然是一个很流行的选择。
创建与CHECK约束类似的功能:与CHECK约束不同,这种功能可以夸表、跨数据库甚至跨服务器使用。
用自己的语句代替用户的操作语句:这通常用于启动复杂视图中的插入操作。

触发器的概念:
触发器是一种特殊类型的存储过程,对特定事件作出响应。触发器有两种类型:数据定义语言触发器(DDL)和数据操纵语言触发器(DML)。
DDL触发器在用户以某些方式对数据库结构进行修改时激活而做出响应。这对于某些安装非常关键(特别是高安全性的安装),但是他们使用范围很狭窄。一般而言,只会在对数据库结构的改变和历史进行极为严格的审计时才会用到DDL触发器。有关DDL触发器的使用是非常高级的概念。
DML触发器是附加在特定表或视图上的代码片段。于需要显示调用代码的储存过程不同,只要有附加触发器的事件在表中发生,触发器中的代码就会自动运行。实际上也不能显示的调用触发器——唯一的做法是在指定的表中执行所需要的操作。
注:除了不能够显示的调用触发器,还可在储存过程中发现另外两个触发器所没有的内容:参数和返回码。
参数:尽管触发器不带任何参数,但他们有一种机制来指出在什么记录上触发。
返回码:虽然可以使用RETURN关键字,但是不能返回一个特定的返回码(因为不能显示的调用触发器,反悔吗没有返回对象)。


可将触发器附加到什么事件呢?因为在SQL中可以使用3类动作查询(在表或视图中插入行,更新行,或删除行),所以有3种类型的触发器,另外加上混合搭配这些事件并对时间定时激活的混合触发类型。
INSERT触发器
DELETE触发器
UPDATE触发器
以上任意类型的混合
注:值得注意的是,有时即使执行的动作是前面这些类型中的一种,触发器也不会被激活。问题在于操作是否在记录的活动中。例如:DELETE语句是一个正常的记录活动,它会激活人和删除触发器,而TRUNCATE TABLE也有删除行的作用,但是只是把表使用的空间释放而已——没有记录单个行删除操作,所以没有激活任何触发器。批量操作默认情况下不激活触发器(需显示告知 批量操作激活触发器)。

ON子句:
这部分只是对创建触发器所针对的对象进行命名。记住,如果触发器的类型是AFTER触发器(使用FOR或AFTER来声明触发器),那么ON子句的目标就必须是一个表——AFTER触发器不支持视图。

WITH ENCRYPTION选项:
该选项和在视图与储存过程中的工作方式一样。如果添加了这个选项,则可以确保没有人能够查看您的代码(甚至是您自己)如果要构建商业发布软件,或者出于安全性的考虑不想让用户看到所修改或访问的数据,那么这个选项是非常有用的。很明显,如果想在以后重新创建触发器,那么需要保存创建触发器的代码副本,一边在其他地方使用。
和视图储存过程一样,使用WITH ENCRYPTION选项需要记住的是,每次在触发器上使用ALTER语句时都必须重新应用该选项。如果使用ALTER TRIGGER语句但不包含WITH ENCRYPTION选项,那么触发器就不再被加密。

FOR|AFTER
FOR(或者AFTER)子句表明了期望触发器在任何动作类型下激活。当有INSERT、UPDATE或DELETE或者三者混合操作时,都可以激活触发器。
例:
FOR INSERT,DELETE
或者是:
FOR UPDATE,INSERT
或者是:
FOR DELETE
使用FOR或AFTER子句声明的触发器只能附加在表上,而不允许附加在视图上.
1、INSERT触发器
当有人向表中插入新的一行时,被标记为FOR INSERT的触发器的代码就会执行。对于插入的每一行来说,SQL Server会创建一个新行的副本并把该副本添加到一个特殊的表中,该表只在触发器的作用域内存在。该表被称为Iserted表只在触发器激活是存在。在触发器开启之前或完成之后都要认为该表是不存在的。
2、DELETE触发器
它和INSERT触发器的工作方式相同,只是Iserted表是空的(毕竟是进行删除而非插入,所以对于Inserted表是没有记录的)。相反,每个被删除的记录的副本将插入到另一个表中,该表称为Delete表。和Iserted表类似,该表只存在于触发器激活的时间内。
3、UPDATE触发器
除了有一点改变外,UPDATE触发器和前面的触发器很类似。当对表中现有的记录进行修改时,都会激活被声明为FOR UPDATE的触发器中的代码。唯一的改变是没有UPDATE表。SQL Server认为每一行好像删除了现有的记录,并插入了全新的记录。您大概也已经想到了,声明为FOR UPDATE的触发器并不只是包含了一个表,而是两个特殊的表,称为Inserted表和Deleted的表。当然,这两个表的行数是完全相同的。

FOR|AFTER 子句与INSTEAD OF子句:
对这两个触发器的选择将影响到是在修改数据之前还是之后进入触发器。无论是哪种情况,在讲任何修改提交给数据库之前,您都将在触发器中。
注:这里需要注意的是,无论进行何种选择,SQL Server会将两个工作表放在一起——一个表保存插入记录的副本(称作Inserted表),另一个保存删除记录的副本(称作Deleted表),如果使用INSTEAD OF触发器,工作表的创建发生在所有约束被检查之前,而如果使用FOR触发器,则这些表的创建是发生在约束被检查之后。使用INSTEAD OF触发器的关键在于可以在用户请求的任何地方运行您自己的代码。这意味着可以清除视图中任何不确定的插入问题,也意味着在约束被检查之前就可采取措施清除违反约束的情况。
使用FOR和AFTER声明的触发器在行为上是一样的。它们与INSTEAD OF触发器最大的区别在于它是在检查完约束之后建立工作表。

NOT FOR REPLICATION选项:
如果添加了该选项,会稍微改变关于合适激活触发器的规则。在适当的位置使用这个选项,无论与复制相关的任务在何时修改表,都不会激活触发器。通常,当修改了原始表并且不会再进行修改的时候会激活触发器。

AS子句
和在储存过程中的使用完全相同,这正是触发器的实质所在。AS关键字告诉SQL Server,代码将要启动。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值