Гарантируют ли «вставленные» и «удаленные» таблицы возвращать свои записи в том же порядке в триггере AFTER UPDATE? - PullRequest
3 голосов
/ 15 ноября 2010

Если у меня есть триггер AFTER UPDATE, будут ли

SELECT * FROM inserted

и

SELECT * FROM deleted

возвращать мне свои записи в том же порядке?

Т.е. скажемЯ смог проиндексировать их результирующие наборы, del [5] и ins [5] вернут мне совпадающие записи, даже если одно значение составного первичного ключа изменилось (что послужило причиной выигрыша внутреннего соединения ').т работы).

Ответы [ 2 ]

4 голосов
/ 15 ноября 2010

Я не верю, что существует любая гарантия на порядок строк внутри вставленных и удаленных - точно так же, как нет гарантии на порядок выбора из любой таблицы без указания ORDER BY.


Я решил посмотреть, смогу ли я создать сценарий, в котором мы могли бы продемонстрировать отсутствие упорядоченности.На моей машине (SQL 2008 Dev) я могу повторно запустить следующий скрипт.Он выводит 2 строки из вставленных и удаленных.Обратите внимание, что мы не касаемся столбца идентификаторов, и поэтому, если предположение было правильным (что они были каким-то образом упорядочены), то одинаковые идентификаторы должны появляться в том же порядке.Это не тот случай.

Сначала вывод:

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
0 голосов
/ 15 ноября 2010

Если у вас есть PRIMARY KEY в таблице (вы обычно хотите, чтобы это поле было id), то они всегда будут возвращаться в том же порядке.

...