Konkurs - przywrócenie pierwotnej kolejności kolumn tabeli
Zgodnie z obietnicą ogłaszam konkurs zapowiedziany na wczorajszej sesji PLSSUG. Zadanie polega na przywróceniu pierwotnej kolejności kolumn tabeli po usunięciu i ponownym odtworzeniu kolumny wyliczanej. Np. mamy tabelę:
create table dbo.Osoby (
id int,
Imie varchar(50) NOT NULL,
Nazwisko varchar(100) NOT NULL,
NazwaPelna as Imie+' '+Nazwisko,
TelefonDoPracy varchar(30) NULL,
TelefonDomowy varchar(30) NULL,
TelefonKom varchar(30) NULL,
Telefony as ISNULL(TelefonDoPracy+';','')+ISNULL(TelefonDomowy+';','')+ISNULL(TelefonKom+';',''),
EMail varchar(100),
DataRejestracji datetime
)
Po usunięciu i ponownym odtworzeniu kolumn NazwaPelna i Telefony, znajdą się one na końcu listy kolumn tabeli. Słabo napisane aplikacje mogą tej zmiany nie wytrzymać. Dlatego będziemy chcieli przywrócić kolejność pierwotną.
W czasie sesji pokazałem, jak wygenerować skrypty, które dla dowolnej tabeli:
1. Zapisze definicję wszystkich kolumn wyliczanych wraz z pierwotną kolejnością do tabeli
2. Usunie wszystkie kolumny wyliczane
3. Odtworzy kolumny wyliczane (lądują na końcu listy)
Definicja tabeli jest w skrypcie recollate.sql umieszczonych w zasobach PLSSUG. Dla wygody zacytuję ją ponownie tutaj.
create table dbo.temp_ComputedCols (
TableName sysname,
ColumnName sysname,
definition nvarchar(max),
position int,
PRIMARY KEY (TableName, ColumnName)
)
Zadanie konkursowe polega na tym, żeby na podstawie definicji tabeli po operacji usunięcia i odtworzenia kolumn wyliczanych + zawartości tabeli temp_ComputedCols wygenerować skrypt, który doprowadzi tabelę do pierwotnej postaci - wszystkie kolumny są w tej samej kolejności co przed operacją. Linie skryptu mają być wygenerowane w języku TSQL w postaci procedury lub funkcji tabelarycznej. Jako jedyny parametr procedury/funkcji powinna być przekazana nazwa tabeli, dla której generujemy skrypt.
Warunki oceny rozwiązania:
1. Rozwiązanie nie może spowodować jakiejkolwiek utraty danych w tabeli
2. Rozwiązanie powinno wykonać minimalną liczbę manipulacji na danych i strukturze tabeli
3. Rozwiązanie powinno przewidywać, że jest więcej niż jedna kolumna wyliczana, tak jak w przykładzie
4. Rozwiązanie powinno być możliwie jak najszybsze
Dla uproszczenia zakładamy, że w chwili rozpoczęcia naprawy na tabeli, którą mamy naprawić nie ma żadnych więzów ani indeksów.
Czekam na rozwiązania konkursowe do końca 15-08-2008 - proszę o przysyłanie ich na mój mail z profilu na wss.pl. Najciekawsze rozwiązania opublikuję, a najlepsze nagrodzę na najbliższym spotkaniu PLSSUG. Do 10.08.2008 będę poza Polską i nie wiem, czy będę miał dostęp do maila, zatem proszę nie zrażać się brakiem mojej reakcji w tym czasie.
Pozdrawiam
Marek Adamczuk