触发器的执行顺序
表1有多个update触发器 tg1,tg2,tg3
因为考虑将来维护性,不想把3个合在一起。
所以我我知道他们的执行顺序怎么定的?
[解决办法]
sp_settriggerorder 可指定第一个和最后一个执行的触发器,其他未指定的会随机触发。
[解决办法]
USE TEMPDBGOIF OBJECT_ID('TB') IS NOT NULL DROP TABLE TBIF OBJECT_ID('TB2') IS NOT NULL DROP TABLE TB2GOCREATE TABLE TB(COL1 INT)CREATE TABLE TB2(ID INT IDENTITY(1,1),COL1 INT)GOCREATE TRIGGER TIG_TB_1 ON TBFOR INSERTASBEGININSERT INTO TB2SELECT COL1+1 FROM INSERTEDENDGOCREATE TRIGGER TIG_TB_2 ON TBFOR INSERTASBEGININSERT INTO TB2SELECT COL1+2 FROM INSERTEDENDGOCREATE TRIGGER TIG_TB_3 ON TBFOR INSERTASBEGININSERT INTO TB2SELECT COL1+3 FROM INSERTEDENDGOINSERT INTO TBSELECT 1GOSELECT * FROM TB2/*1 22 33 4*/
[解决办法]
USE TEMPDBGOIF OBJECT_ID('TB') IS NOT NULL DROP TABLE TBIF OBJECT_ID('TB2') IS NOT NULL DROP TABLE TB2GOCREATE TABLE TB(COL1 INT)CREATE TABLE TB2(ID INT IDENTITY(1,1),COL1 INT)GOCREATE TRIGGER TIG_TB_1 ON TBFOR INSERTASBEGININSERT INTO TB2SELECT COL1+1 FROM INSERTEDENDGOCREATE TRIGGER TIG_TB_3 ON TBFOR INSERTASBEGININSERT INTO TB2SELECT COL1+3 FROM INSERTEDENDGOCREATE TRIGGER TIG_TB_2 ON TBFOR INSERTASBEGININSERT INTO TB2SELECT COL1+2 FROM INSERTEDENDGOINSERT INTO TBSELECT 1GOSELECT * FROM TB2/*1 22 43 3*/
[解决办法]
如果不存在相互的引用关系,即tg2要引用tg1的结果的情形,执行先后没有关系,多个触发器是在一个事务里面,如果有一个rollback,全部会取消