因为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. 自学H5第二天

    笔记: 1.css之外联样式 2.css之行间样式: 3.css之内联样式 二.边框的知识: 1.边框的复合样式: 2.边框的单一样式: /*单一样式*/ border-width: 1px 2px ...

  2. Verilog学习笔记设计和验证篇(五)...............层次化事件队列

    详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...

  3. 【Effective Java】10、java注解使用

    package cn.xf.cp.ch02.item35; import java.lang.annotation.ElementType; import java.lang.annotation.R ...

  4. Dynamics.js - 创建逼真的物理动画的 JS 库

    Dynamics.js 是一个用来创建物理动画 JavaScript 库.你只需要把dynamics.js引入你的页面,然后就可以激活任何 DOM 元素的 CSS 属性动画,也可以用户 SVG 属性. ...

  5. [deviceone开发]-UI组件的动画示例

    一.简介 自定义组件模版(头部,按钮,加减数量,加载,底部弹出,开关(文字/无文字),选项卡(2-4), radio)全部带自定义动画效果,需从组件商店中添加:do_Animator组件 二.效果图 ...

  6. js一些代码方法

    概要 1.替换json对象中属性值(包括子对象) 2.兼容多个$库写法(zepto与jquery) 3.闭包保持变量的做法 详情 1.替换json对象中属性值(包括子对象) //替换json对象属性值 ...

  7. Hybrid框架UI重构之路:二、事出有因

    上文回顾:Hybird框架UI重构之路:一.师其长技以自强 一切的重构都是有原因的,或许为了更快速度.更好体验.更快捷开发等,于是就有了自己的开发目标,简单看看未重构前UI("中国移动式&q ...

  8. 设置跨域的iframe的高度

    原因 如下图,A域中有个B域的页面,但是B的页面的长度不确定,A无法去设置一个准确的高度. PS:iframe高度设置auto是无效的 解决办法 如上图, (1)在B页面中加一个A的代理页面的ifra ...

  9. Ajax基本概念和原理

    什么是Ajax Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. Ajax的全称是Asynchronous JavaScript and XML,即异步JavaScript+X ...

  10. javascript --- 实时监听输入框值的变化

    实时监听文本框值变化是非常常见的功能,通常最简单的办法就是用keyup,keydown来实现,但是这种方法有两个问题,一个是当直接复制粘贴的时候没法监听到事件,另外一个问题是在移动端,使用删除键删除输 ...