Sql server 2008 Sqlserver标准触发顺序

Sql server 2008 Sqlserver标准触发顺序,sql-server-2008,triggers,crm,Sql Server 2008,Triggers,Crm,我有一个由外部CRM部分创建和编辑的数据库,其中某些表上有多个(最多2个)after触发器。这是因为CRM(我对其控制有限)自动生成了一个触发器,而另一个触发器包含我的代码 CRM触发器为插入的数据行生成主键。我的触发器需要访问该主键才能将其作为外键写入另一个表。我用 Select @id=max(id) from mytable 因为Scope_身份并没有以某种方式产生期望的结果 这一直有效,直到我让CRM重新创建表及其自己的触发器。我的触发器选择的该表的最大id似乎总是实际id-1 当我使

我有一个由外部CRM部分创建和编辑的数据库,其中某些表上有多个(最多2个)after触发器。这是因为CRM(我对其控制有限)自动生成了一个触发器,而另一个触发器包含我的代码

CRM触发器为插入的数据行生成主键。我的触发器需要访问该主键才能将其作为外键写入另一个表。我用

Select @id=max(id) from mytable
因为Scope_身份并没有以某种方式产生期望的结果

这一直有效,直到我让CRM重新创建表及其自己的触发器。我的触发器选择的该表的最大id似乎总是实际id-1

当我使用相同的代码修改触发器时,它总是让程序再次工作

我的问题是: SQL server(我使用的是SQL server 2008)是否按创建时间设置其触发器顺序

以及: 是

是否要永久更改此设置,或者每次CRM重新创建其触发器时,我都必须再次调用该过程?(使用拖放和创建,而不是更改)

希望这个问题的答案能帮助那些关注同样问题的人

关于

它没有文档记录,但是我相信最后一个设置将保留在触发器中,只要它没有被修改。(相反,记录表明,如果修改触发器,它将丢失此设置)。然而,这似乎是可行的:

create table T (ID int not null)
go
create trigger T_T1 on T
after insert
as
    RAISERROR('T1',10,1) WITH NOWAIT
go
create trigger T_T2 on T
after insert
as
    RAISERROR('T2',10,1) WITH NOWAIT
go
create trigger T_T3 on T
after insert
as
    RAISERROR('T3',10,1) WITH NOWAIT
go
insert into T(ID) values (1)
go
sp_settriggerorder 'T_T2','Last','INSERT'
go
insert into T(ID) values (2)
go
drop trigger T_T1
go
create trigger T_T1 on T
after insert
as
    RAISERROR('T1',10,1) WITH NOWAIT
go
insert into T(ID) values (3)
结果:

T1
T2
T3

(1 row(s) affected)
T1
T3
T2

(1 row(s) affected)
T3
T1
T2

(1 row(s) affected)
但是,关于你的第一个问题:

SQL server(我使用的是SQL server 2008)是否按创建时间设置其触发器顺序

这似乎也是,但我不相信这一点。是记录任何订单的唯一场所


最后,正如我在评论中提到的,我不会依赖于您当前的
Select@id=max(id)from mytable
方法-它可能会因为许多原因而被破坏,但最重要的是每个方法触发一次触发器,并且可能会响应多行,因此,您应该编写触发器来使用插入的伪表(并期望它包含0、1或多行)。

Select@id=max(id)from mytable
对于任何多行语句都是无效的。为什么不在触发器中使用插入的和删除的伪表呢?谢谢。我不能依赖插入的表来获取id,因为id正在由第一个after触发器更新
Scope\u Identity()
显然在处理批量插入时对我也没有帮助(尽管在我们的情况下不应该发生这种情况)
T1
T2
T3

(1 row(s) affected)
T1
T3
T2

(1 row(s) affected)
T3
T1
T2

(1 row(s) affected)