事务的执行流程
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触发器是在DML事务提交之前执行的所以如果数据是不可接受的,可以回滚事务。
每个表对于每个表事件只能有一个instead of 触发器,除了表以外,还可以在视图上应用instead of触发器
after触发器适用情况(在事务完成之后,事务提交之前触发)
进行复杂的数据验证
实现复杂的业务规则
数据审计跟踪记录
维护修改日期列
实现客户订制的参照完整性检查和级联删除
instead of触发器适用情况(总是回滚触发触发器的事务,并使用其他逻辑替代原来的DML语句)
当DML语句试图更新一个不可更新的试图时,利用instead of触发器代替它对基础表的更新
当DML语句试图直接更新库存表时,利用instead of触发器代替它对库存事务表进行更新
触发器的限制
不能使用的sql命令
create alter 或者drop database
Reconfigure
Restore database 或者 log
disk resize
disk init
安全权限
Inserted 和Deleted表是只读的数据映像表,可以将它们看作事务日志的试图
Deleted表包含了受到DML语句影响的记录行在操作之前的旧值,Inserted表包含了受到DML语句影响的记录行在操作之后的新值
DML语句
inserted表
deleted表
insert
新插入的行
空
update
受影响的行更新后的新值
受影响的行更新之前的旧值
Inserted 和Deleted表的作用域非常有限,只有在触发器中才可见,触发器中调用的存储过程中无法使用Inserted 和Deleted表。
Inserted 和Deleted表无法访问text、ntext、image数据类型的列
在有数百个触发器的数据库中,一般来说 不能按照表事件组织触发器,而应该使用触发器的任务来组织他们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。