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


可以看到,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的操作顺序:

图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
返回错误信息,

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










