Да, прав си за join-овете, просто в случая ставаше въпрос за допускане само на 1 ред в inserted, а тогава няма проблем с производителността.
Но сега осъзнавам, че пропуснах да спомена особено важен аспект от проблема. Ти си прав за join-a, с курсори не ми се е налагало да работя, но разбирам какво имаш предвид. Но точно в този конкретен случай аз все още не виждам как ще стане така. Защото променените полета са от primary key - a.
Ще се опитам да опиша 1 такава проблемна постановка.
2 таблици, схемите са:
A(pk1, pk2, field1, field2...) - pk1 и pk2 са ключ
B(pk1, pk2, pk3, f1, f2, f3...) - pk1, pk2 и pk3 са ключ
Искаме тригер от A към B:
Ако сменим стойността на pk1 в A, то тази нова стойност трябва да се запише и в полето pk1 на B, на мястото на съответстващата стара. Нещо като Cascade Update за Foreign key constraint. Същото и за полето pk2.
Сега да вземем конкретни възможни кортежи:
В таблицата A:
1. (1, 1, 'blabla', 'blabla2', ...)
2. (2, 1, 'blabla', 'blabla2', ...)
3. (1, 2, 'blabla', 'blabla2', ...)
4. (2, 2, 'blabla', 'blabla2', ...)
В таблица B:
1. (1, 1, 1, 'blabla', 'blabla2', ...)
2. (2, 1, 2, 'blabla', 'blabla2', ...)
3. (1, 2, 3, 'blabla', 'blabla2', ...)
4. (2, 2, 4, 'blabla', 'blabla2', ...)
И например имаме следния update:
UPDATE A
SET pk2 = pk2 + 1
Сега искаме промените да отидат на съответното място и в B.
Join на B с inserted? По кои полета? pk1 не ни гарантира връзка с единствен запис от inserted, а pk2 вече имат различни стойности в inserted и B. Може би трябва и е възможно да минем и през deleted, там имаме съответствието на старите редове. Е, да де, стигнах и до най-същественото изречение от първоначалния си пост:
Как да разбера кой ред в inserted на кой ред в deleted съответства?
Аз тук изкуствено си сложих номерация горе. А има ли нещо системно в MSSQL, което да дава съответствието: при update-a на таблицата, този ред (в deleted) беше изтрит и на негово място сега е ето този ред (от inserted)
Забележка: Моят проблем вече е решен, пак заобиколно. Тази дискусия, обаче, все още ме интересува! Заради спорта, пък и за да знам занапред. То и аз ще си търся информация, но ако някой знае нещо, което да хвърли светлина върху проблема... моля, споделете!
P.S. Уф, че било трудно да задаваш въпроси в писмен вид. Простете ми, ако още не го владея този номер! Аз обикновено драскам скици и жестикулирам - много е информативно!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|