触发器的学习笔记(执行流程,应用,权限)
发布时间:2020-12-12 15:56:16 所属栏目:MsSql教程 来源:网络整理
导读:? 事务的执行流程 1、? 执行Identity insert 检查 ??? --- 允 许 将 显 式 值 插入表的 标识 列中 2、? 检查为空性约束 3、? 检查数据类型 4、? 执行 instead of 触发器。如果存在insert of 触发器,将停止执行触发它的DML语句。instead of触发器是不可递归
?
事务的执行流程
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触发器
?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |