触发器的学习笔记(执行流程,应用,权限)

 
事务的执行流程
1、 执行Identity insert 检查     --- 插入表的 标识 列中
2、 检查为空性约束
3、 检查数据类型
4、 执行 instead of 触发器。如果存在insert of 触发器,将停止执行触发它的DML语句。instead of触发器是不可递归调用的,因此,如果一个instead of 触发器执行了一个DML命令,而这个命令再次触发了同一个事件(insert,update,delete),第二次产生的这个事件将不会再次触发instead of 触发器。
5、 检查主键约束
6、 检查check约束
7、 检查外部键约束
8、 执行DML语句,并更新事务日志
9、 执行after触发器
10、 提交事务
11、 写入数据文件
 
注意点:
after触发器是在完成所有的约束检查之后执行的。因此不能使用它来修改数据,所以数据必须经过所有的完整性检查,包括外部键约束的检查。
 
instead of 触发器可以解决外部键的问题,但却不能解决为空性,数据类型或者标识列的问题
after触发器是在DML事务提交之前执行的所以如果数据是不可接受的,可以回滚事务。
 
每个表对于每个表事件只能有一个instead of 触发器,除了表以外,还可以在视图上应用instead of触发器
 
after触发器适用情况(在事务完成之后,事务提交之前触发)
进行复杂的数据验证
实现复杂的业务规则
数据审计跟踪记录
维护修改日期列
实现客户订制的参照完整性检查和级联删除
 
instead of触发器适用情况(总是回滚触发触发器的事务,并使用其他逻辑替代原来的DML语句)
当DML语句试图更新一个不可更新的试图时,利用instead of触发器代替它对基础表的更新
当DML语句试图直接更新库存表时,利用instead of触发器代替它对库存事务表进行更新
当DML语句试图删除一行时,利用instead of触发器将被删除的行放入一个归档表
 
触发器的限制 不能使用的SQL命令
create alter 或者drop database
Reconfigure
Restore database 或者 log
Disk resize
Disk init
 
安全权限
只有拥有sysadmin固定服务器角色的用户;拥有db_owner或db-ddladmin固定数据库角色的用户;或者是表的所有者,触发器内执行的代码是按照拥有该触发器的表的的所有者的安全权限来执行的
 
SQLserver可以让触发器中的代码获取他的事务所作的修改
Inserted 和Deleted表是只读的数据映像表,可以将它们看作事务日志的试图
Deleted表包含了受到DML语句影响的记录行在操作之前的旧值,Inserted表包含了受到DML语句影响的记录行在操作之后的新值
DML语句                 inserted表                            deleted表
insert                   新插入的行                             空
update                  受影响的行更新后的新值             受影响的行更新之前的旧值
delete                   空                                 删除的行
Inserted 和Deleted表的作用域非常有限,只有在触发器中才可见,触发器中调用的存储过程中无法使用Inserted 和Deleted表。
Inserted 和Deleted表无法访问text、ntext、image数据类型的列
 
在有数百个触发器的数据库中,一般来说 不能按照表事件组织触发器,而应该使用触发器的任务来组织他们。
 
SQLserver中最多可嵌套调用 32层,可以使用 Trigger_NestLevel()函数来返回嵌套的层数。
 
如果一个表同时拥有instead of 触发器和after触发器
执行顺序:
1、 DML语句启动一个事务
2、 触发instead of 触发器以替代触发它的DML语句
3、 如果这个instead of 触发器执行了会产生同一表事件的DML语句,处理过程就将继续下去
4、 触发after触发器
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值