“插入”和“删除”表是否保证在AFTER UPDATE触发器中以相同的顺序返回其记录?

时间:2010-11-15 11:41:04

标签: tsql sql-server-2008 triggers

如果我有一个AFTER UPDATE触发器,

SELECT * FROM inserted

SELECT * FROM deleted

以同样的顺序给我回复他们的记录?

即。让我说我能够索引到他们的结果集,将 del [5]和ins [5]返回匹配的条目,即使复合主键的一个值发生了变化(这也就是内连接不起作用的原因)。

2 个答案:

答案 0 :(得分:4)

我不相信对插入和删除行的排序有任何保证 - 正如没有指定保证从任何表中选择而没有指定ORDER BY。


我决定看看我是否可以制作一个可以证明缺乏排序的脚本。在我的机器上(SQL 2008 Dev),我可以重复运行以下脚本。它从插入和删除输出2行。请注意,我们不会触摸ID列,因此如果假设是正确的(它们是以某种方式排序的),那么相同的ID应该以相同的顺序出现。这不是这种情况。

首先,输出:

ID          D1                      V1
----------- ----------------------- ----------------------------------------------------------------------------------------------------
32          2010-03-01 00:00:00.000 text
60          2010-02-01 00:00:00.000 text

(2 row(s) affected)

ID          D1                      V1
----------- ----------------------- ----------------------------------------------------------------------------------------------------
60          2010-03-01 00:00:00.000 text
32          2010-02-01 00:00:00.000 text

(2 row(s) affected)

产生这个的脚本:

create table T1 (
    ID int not null,
    D1 datetime not null,
    V1 varchar(100) not null,
    constraint PK_T1 PRIMARY KEY (D1,ID)
)
go
create index IX_T1_D1 on T1(D1)
go
insert into T1(ID,D1,V1)
select ID,DATEADD(day,ID-1,'20100101'),'text'
from (select ROW_NUMBER() OVER (ORDER BY so1.id) from sysobjects so1,sysobjects so2,sysobjects) t(ID)
go
create trigger T_T1_U on T1 after update
as
begin
    select * from inserted
    select * from deleted
end
go
sp_configure 'disallow results from triggers',0
go
RECONFIGURE
go
update T1 set D1 = DATEADD(month,CASE WHEN DATEPART(month,D1)=2 THEN 1 ELSE -1 END,D1)
where D1 in ('20100201','20100301')
go
sp_configure 'disallow results from triggers',1
go
RECONFIGURE
go
drop table T1
go

答案 1 :(得分:-2)

如果桌面上有PRIMARY KEY(您通常希望id字段为此),则它们将始终以相同的顺序返回。