表1有多个update触发器   tg1,tg2,tg3 
因为考虑将来维护性,不想把3个合在一起。
所以我我知道他们的执行顺序怎么定的?

解决方案 »

  1.   

    sp_settriggerorder 可指定第一个和最后一个执行的触发器,其他未指定的会随机触发。
      

  2.   

    USE TEMPDB
    GO
    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    IF OBJECT_ID('TB2') IS NOT NULL DROP TABLE TB2
    GO
    CREATE TABLE TB(COL1 INT)
    CREATE TABLE TB2(ID INT IDENTITY(1,1),COL1 INT)
    GO
    CREATE TRIGGER TIG_TB_1 ON TB
    FOR INSERT
    AS
    BEGIN
    INSERT INTO TB2
    SELECT COL1+1 FROM INSERTED
    END
    GO
    CREATE TRIGGER TIG_TB_2 ON TB
    FOR INSERT
    AS
    BEGIN
    INSERT INTO TB2
    SELECT COL1+2 FROM INSERTED
    END
    GO
    CREATE TRIGGER TIG_TB_3 ON TB
    FOR INSERT
    AS
    BEGIN
    INSERT INTO TB2
    SELECT COL1+3 FROM INSERTED
    END
    GO
    INSERT INTO TB
    SELECT 1
    GO
    SELECT * FROM TB2
    /*
    1 2
    2 3
    3 4
    */
      

  3.   

    USE TEMPDB
    GO
    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    IF OBJECT_ID('TB2') IS NOT NULL DROP TABLE TB2
    GO
    CREATE TABLE TB(COL1 INT)
    CREATE TABLE TB2(ID INT IDENTITY(1,1),COL1 INT)
    GO
    CREATE TRIGGER TIG_TB_1 ON TB
    FOR INSERT
    AS
    BEGIN
    INSERT INTO TB2
    SELECT COL1+1 FROM INSERTED
    END
    GO
    CREATE TRIGGER TIG_TB_3 ON TB
    FOR INSERT
    AS
    BEGIN
    INSERT INTO TB2
    SELECT COL1+3 FROM INSERTED
    END
    GO
    CREATE TRIGGER TIG_TB_2 ON TB
    FOR INSERT
    AS
    BEGIN
    INSERT INTO TB2
    SELECT COL1+2 FROM INSERTED
    END
    GO
    INSERT INTO TB
    SELECT 1
    GO
    SELECT * FROM TB2
    /*
    1 2
    2 4
    3 3
    */
      

  4.   

    如果不存在相互的引用关系,即tg2要引用tg1的结果的情形,执行先后没有关系,多个触发器是在一个事务里面,如果有一个rollback,全部会取消
      

  5.   

    服务器没进行收缩或整理页之类的操作的话,执行顺序应该是不变的,系统从触发器列表中无序读出所有触发器,先执行FIRST,再执行所有触发器,最后执行LAST触发器,中间的顺序应该就是读出来的顺序。读出来的顺序应该也就是插入的顺序了。