因为05之后的版本允许了一个对象有多个after触发器,所以呢~顺序方面还是要留意一下下的。比如我现在要往一个测试表里面添加多个触发器。

USE Test
GO
CREATE TABLE AAA3 (ID INT IDENTITY(1,1),Name NVARCHAR(50))
GO CREATE TRIGGER TR_AAA3_1 ON AAA3 FOR INSERT
AS
BEGIN
PRINT 'TRIGGER1'
END
GO CREATE TRIGGER TR_AAA3_2 ON AAA3 FOR INSERT
AS
BEGIN
PRINT 'TRIGGER2'
END
GO CREATE TRIGGER TR_AAA3_3 ON AAA3 FOR INSERT
AS
BEGIN
PRINT 'TRIGGER3'
END
GO CREATE TRIGGER TR_AAA3_4 ON AAA3 FOR INSERT
AS
BEGIN
PRINT 'TRIGGER4'
END
GO CREATE TRIGGER TR_AAA3_5 ON AAA3 FOR INSERT
AS
BEGIN
PRINT 'TRIGGER5'
END
GO CREATE TRIGGER TR_AAA3_6 ON AAA3 FOR INSERT
AS
BEGIN
PRINT 'TRIGGER6'
END
GO CREATE TRIGGER TR_AAA3_7 ON AAA3 FOR INSERT
AS
BEGIN
PRINT 'TRIGGER7'
END
GO CREATE TRIGGER TR_AAA3_8 ON AAA3 FOR INSERT
AS
BEGIN
PRINT 'TRIGGER8'
END
GO

创建测试表和触发器

然后添加几条测试数据来看顺序

INSERT INTO dbo.AAA3
( Name )
VALUES ( N'a' ) GO 2 开始执行循环
TRIGGER1
TRIGGER2
TRIGGER3
TRIGGER4
TRIGGER5
TRIGGER6
TRIGGER7
TRIGGER8 (1 行受影响)
TRIGGER1
TRIGGER2
TRIGGER3
TRIGGER4
TRIGGER5
TRIGGER6
TRIGGER7
TRIGGER8

测试数据

可以看到是按照创建顺序来执行的。(官方提出表里面的各个触发器执行的顺序其实是无序的。只有在如果了第一条和最后一条执行触发器之后,才能保证这2个触发器的顺序,然而其它的触发器执行的顺序是无须的。)

然后我试下指定第一条和最后一条的位置。然后再进行测试。(是指定了触发器7第一,触发器4最后一个)。其它顺序也没变。

EXEC sys.sp_settriggerorder @triggername = N'TR_AAA3_7', -- nvarchar(517)
@order = 'first', -- varchar(10)
@stmttype = 'INSERT', -- varchar(50)
@namespace = NULL -- varchar(10) EXEC sys.sp_settriggerorder @triggername = N'TR_AAA3_4', -- nvarchar(517)
@order = 'last', -- varchar(10)
@stmttype = 'INSERT', -- varchar(50)
@namespace = NULL -- varchar(10) INSERT INTO dbo.AAA3
( Name )
VALUES ( N'a' ) GO 2 开始执行循环
TRIGGER7
TRIGGER1
TRIGGER2
TRIGGER3
TRIGGER5
TRIGGER6
TRIGGER8
TRIGGER4 (1 行受影响)
TRIGGER7
TRIGGER1
TRIGGER2
TRIGGER3
TRIGGER5
TRIGGER6
TRIGGER8
TRIGGER4

重新测试

看起来好像也不是无序啊~就和创建时间排序一致嘛~但是我认为还是不要抱这种错觉,这个版本是这样,没人能保证下一个版本还是这样哦!所以我觉得还是不要太相信这个特意做出来的测试例子。

如果需要查询触发器的状态。可以参考以下语句

SELECT a.name,a.object_id,a.is_disabled,a.is_instead_of_trigger,b.is_first,b.is_last,b.is_trigger_event FROM sys.triggers a
INNER JOIN sys.trigger_events b ON a.object_id = b.object_id
WHERE parent_id = OBJECT_ID('AAA3') name object_id is_disabled is_instead_of_trigger is_first is_last is_trigger_event
-------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- --------------------- -------- ------- ----------------
TR_AAA3_1 775673811 0 0 0 0 1
TR_AAA3_2 791673868 0 0 0 0 1
TR_AAA3_3 807673925 0 0 0 0 1
TR_AAA3_4 823673982 0 0 0 1 1
TR_AAA3_5 839674039 0 0 0 0 1
TR_AAA3_6 855674096 0 0 0 0 1
TR_AAA3_7 871674153 0 0 1 0 1
TR_AAA3_8 887674210 0 0 0 0 1

最后我们乱入一个InsteatOf 触发器。看下执行顺序是怎么样。

CREATE TRIGGER TR_AAA3_1_1 ON AAA3 INSTEAD OF INSERT
AS
BEGIN
INSERT INTO dbo.AAA3
( Name )
SELECT Inserted.Name
FROM Inserted
PRINT 'Instead 1'
END
GO INSERT INTO dbo.AAA3
( Name )
VALUES ( N'a' ) TRIGGER7
TRIGGER1
TRIGGER2
TRIGGER3
TRIGGER5
TRIGGER6
TRIGGER8
TRIGGER4 (1 行受影响)
Instead 1 TRIGGER7
TRIGGER1
TRIGGER2
TRIGGER3
TRIGGER5
TRIGGER6
TRIGGER8
TRIGGER4 (1 行受影响)
Instead 1

测试instead of 触发器

就是说instead of 触发器执行是会在 after触发器之后??我怀疑是因为创建时间问题。然后反过来先创建 instead of 触发器,发现执行顺序也是 这样纸。

恕我眼拙,在触发器介绍的文档里面也没有找到这个描述。还是各位不吝赐教

今天说一下DML触发器的顺序的更多相关文章

  1. sp_settriggerorder 设置触发器执行顺序

    sp_settriggerorder (Transact-SQL)     本主题适用于:SQL Server(从 2008 开始)Azure SQL 数据库Azure SQL 数据仓库并行数据仓库 ...

  2. SQL Server 数据库DML触发器 【一】

    今天学习SQL Server数据库中DML触发器(DDL触发器以后有时间继续学习). 当删除一条创建有触发器的表中的内容时,触发器执行SQL语句. 1.首相先创建一张表,表名称是 [Test] , 内 ...

  3. 杂谈--DML触发器学习

    触发器按类型分为三类: 1. DML 触发器,在数据变更时触发: 2. DDL 触发器,在修改数据库级别或实例级别对象时触发: 3. Login 触发器,在用户登录时触发: 最常见的是DML触发器,D ...

  4. DML触发器1

    数据库触发器是特殊的存储程序.通常不直接调用它们,而是由数据库的事件触发. 触发器分类: >DML触发器 >instead-of触发器 >系统事件触发器,还可以是DDL 一. DML ...

  5. [转]Oracle Form 触发器执行顺序

    Trigger 不是数据库中的触发器,不过功能类似,都是当某个事件发生的时候会触发. Trigger中可以编写代码,当对应事件发生的时候就会执行该Trigger中的代码. Oracle Form中的T ...

  6. FORM触发器执行顺序

    触发器执行顺序: 1. 当打开FORM时: (1) PRE-FORM (2) PRE-BLOCK(BLOCK级) (3) WHEN-NEW-FORM-INSTANCE (4) WHEN-NEW-BLO ...

  7. SQL语句(二十一)—— 触发器(DML触发器)

    触发器 一 .触发器概述(特殊的存储过程) 定义: 在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用. 作用: ...

  8. 触发器三(行级DML触发器)(学习笔记)

    行级DML触发器 每当一条记录出现更新操作时进行触发操作定义时要定义FOR EACH ROW 使用":old.字段"和":new.字段"标识符 No. 触发语句 ...

  9. 触发器二(DML触发器)(学习笔记)

    DML触发器(语句触发器) 由DML语句进行触发,当用户执行了INSERT,UPDATE,DELETE操作时就会触发操作 示例一.只有在每个月的10日才允许办理,新员工入职与离职,其他时间不允许增加和 ...

随机推荐

  1. 搭建java环境

    操作系统:Win10 java版本:1.8.0_102 1.下载安装java JDK(安装时把jre放在了同级目录) 地址为:F:\Program Files\Java 目录下 2.配置环境变量 此电 ...

  2. Gym 101102D---Rectangles(单调栈)

    题目链接 http://codeforces.com/gym/101102/problem/D problem  description Given an R×C grid with each cel ...

  3. 自学H5第一天笔记

    1.web前端开发工程师 1.web前端开发工程师是做什么的 要与网站打交道 2.成为一名web前端开发工程师需要具备的条件 1.兴趣 2.敲代码 3.web前端开发需要学习什么 1.软件 浏览器:有 ...

  4. java中set接口的用法

    java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特 ...

  5. The POM for XXX:jar:${com.ld.base.service.version} is missing, no dependency information available

    最近有个jar改了名字后,有个依赖它的工程死活引用的是老名字,导致打包的时候出错,如下所示: [INFO] ---------------------------------------------- ...

  6. 一道js面试题

     当然这道面试题并不一定就能在你面试的时候遇到,但是不怕一万就怕万一,会的多一些还是好的. 问:怎么判断一串字符中哪个字符出现的最多,最多几次或者这串字符分别有哪些,每个字符出现了几次.写你请出运算代 ...

  7. Ext.Net MVC 配置(1)

    1.在VS2012中创建MVC3项目 2.在项目总启动NuGet,在里面安装Ext.net 3.安装Ext.net 4.安装完成后项目中相关的配置文件就会有所改变了. 5.测试:运行mvc项目:htt ...

  8. ESLint – 可扩展的 JavaScript & JSX 校验工具

    ESLint 是一个开源的 JavaScript 代码校验工具,最初是由 Nicholas C. Zakas 在2013年创建的.经常被用来发现问题的模式或代码,不符合特定的风格准则. ESLint ...

  9. CSS中!important的作用

    提升指定样式规则的应用优先权. IE6及以下浏览器有个比较显式的支持问题存在,!important在同一条规则集里不生效.请看下述代码: 示例代码: div { color: #f00 !import ...

  10. 当jquery ajax遇上401请求

    jquery ajax是个很常用接口,而在请求时候,可能存在响应401的情况(身份认证过期或未登录),比较容易出现在混合应用上,如何进行身份认证,重发失败请求,还是值得注意的. ajax请求有两种方式 ...