SQL Server触发器及触发器中的事务学习

2020-07-10 08:07:41易采站长站整理
Go

use tempdb
Go
Insert Into Contact (Name,Sex) Values (‘Bill’,’U’)
Go
Select * From Contact

imageimage


可以看到,Instead Of 触发器tr_Contact内容没有Insert的SQL语句,不会引发Check处理错误,而且检查Insert动作后的结果,发现表Contact也没有之前我们Insert的数据。这些足够验证了Instead Of触发器的执行先后顺序和代替执行操作。


 


 


 


DML 触发器 Vs DDL 触发器

      DML 触发器在 Insert、Update 和 Delete 语句上操作,可以作为After 触发器 和 Instead Of 触发器。


     DDL 触发器对 Create、Alter、Drop 和其他 DDL 语句以及执行 DDL 式操作的存储过程执行操作,只可作为After触发器,不能Instead Of触发器。


     前面的内容,有描述DML触发器中的After & Instead Of触发器内容,下面直接来看DDL的操作顺序:


     image


     图3.


     从图3.可以知道,在DDL触发器中,是没有创建Inserted & Deleted过程的,我们通过简单的例子去测试下。


     创建一个服务器范围内的DDL触发器,检查有没有Inserted 表,

use master
Go
If Exists(Select 1 From sys.server_triggers Where name=’tr_createDataBase’)
 Drop Trigger tr_createDataBase On All Server
Go
Create Trigger tr_createDataBase On All Server After Create_DataBase
As 
Select * From inserted
Go

执行创建数据库SQL语句,

use master
Go
Create Database myDataBase On Primary
(Name=’MyDataBase_Data’,Filename=’E:DATASQL2008DE01MyDataBase_Data.mdf’) Log On 
(Name=’MyDataBase_Log’,Filename=’E:DATASQL2008DE01MyDataBase_Log.ldf’)
Go

返回错误信息,


image


使用上边相同的方法,我们验证DDL触发器中,不会创建Deleted表;是否创建Deleted & Inserted,也可以认为是DDL触发器与DML触发器不同之处。在DLL触发器与DML触发器不同的一个重要特征是作用域,DML触发器只能应用在数据库层(Database Level)的表和视图上,而DDL触发器应用于数据库层(Database Level)和服务器层(Server Level);DDL触发器的作用域取决于事件。下面简单描述下事件组的内容。

相关文章 大家在看