因为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. hibernate---注解--CascadeType属性

    cascade表示级联操作 CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象.对应EntityManager的merge方法 Cas ...

  2. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  3. Oracle数据库建表并用SQL编程分等级

    --创建学生表create table XS_543 ( XH char(6) not null , XM varchar2(20) not null, ZYM varchar2(10), XB ch ...

  4. 出现异常:Unsupported major.minor version

    今天在使用springboot的最新版本的时候出现了这个问题 ,抛出来的异常是:UnsupportedClassVersionError 打开异常的源码看了一下 * Thrown when the J ...

  5. 总结一下工作中用到的Mybatis业务逻辑

    1.简单说明. MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的 ...

  6. MySQL日期处理(笔记)

    对于刚学习MySQL的人日期的处理是个大坑. 这里整理了如何处理常见的日期问题. (这只是我在学习过程中关于日期处理方面知识的总结,会有一些错误和片面的地方.) Date 函数 函数 描述 NOW() ...

  7. [moka同学笔记]Yii2 数据操作Query Builder

    Query Builder [php] view plain copy   $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name ...

  8. Razor语法大全

    本文页面来源地址:http://www.cnblogs.com/dengxinglin/p/3352078.html Razor是基于framewor4以上写的一个开源项目:https://githu ...

  9. vueJS简单的点击显示与隐藏的效果

    目前前端框架太多,接触过angular.ember,现在开始倒腾vue 此处用到v-if.v-else.v-show,v-if或让元素不在DOM上,v-show只是改变display:block属性, ...

  10. 如何垂直居中div?面试经常问到

    水平居中:给div设置一个宽度,然后添加margin:0 auto属性 div{ width:200px; margin:0 auto;} 让绝对定位的div居中 ;;;;} 重点来了! 水平垂直居中 ...