SQL Server w logistyce

Tabela _dbup w bazie danych SQL Server

Rejestr wykonanych skryptów migracyjnych — decyduje o tym, które zmiany schematu zostały już wprowadzone w danej bazie.

sql.server.net.pl/sql/
Uśmiechnięty analityk w garniturze przy szerokim monitorze
Uśmiechnięty analityk w garniturze przy szerokim monitorze
W skrócie
  • Tabela odpowiada na jedno pytanie: które skrypty zmieniające schemat zostały już wykonane w tej bazie.
  • Przed uruchomieniem migracji narzędzie porównuje listę plików z zawartością tabeli i wykonuje wyłącznie brakujące pozycje.
  • Dzięki temu ten sam zestaw skryptów można bezpiecznie uruchomić na bazie testowej, wzorcowej i produkcyjnej.
  • Ręczna modyfikacja wierszy jest operacją wysokiego ryzyka — rozjeżdża stan faktyczny bazy z jej zapisaną historią.

Do czego służy tabela [dbo].[_dbup]

Baza danych rozwija się razem z aplikacją: dochodzą kolumny, zmieniają się typy, powstają nowe indeksy. Przy jednym wdrożeniu da się to prowadzić ręcznie, przy kilkudziesięciu — nie. Tabela [dbo].[_dbup] jest miejscem, w którym narzędzie migracyjne zapisuje, co już zrobiło.

Mechanizm jest prosty i właśnie dlatego niezawodny. Skrypty leżą w katalogu i mają ustaloną kolejność wynikającą z nazwy. Przy uruchomieniu narzędzie odczytuje listę nazw zapisanych w tabeli, porównuje ją z zawartością katalogu i wykonuje wyłącznie te pliki, których na liście nie ma. Po udanym wykonaniu dopisuje nazwę i datę.

Praktyczna konsekwencja: proces jest powtarzalny i bezpieczny przy ponownym uruchomieniu. Wywołanie migracji na bazie, która jest już aktualna, nie zmienia niczego. To pozwala włączyć aktualizację schematu do standardowej procedury wdrożenia, zamiast traktować ją jako osobną, ręczną czynność wymagającą uwagi administratora.

Przebieg aktualizacji schematu bazy danych
Odczyt katalogu Odczyt kataloguNarzędzie zbiera listę dostępnych skryptów w ustalonej kolejności
Porównanie PorównanieNazwy z katalogu zestawiane są z zawartością tabeli _dbup
Wykonanie WykonanieUruchamiane są wyłącznie skrypty, których jeszcze nie odnotowano
Zapis historii Zapis historiiNazwa i data trafiają do tabeli dopiero po udanym wykonaniu

Zapis następuje po wykonaniu skryptu, nie przed nim. Skrypt przerwany błędem nie zostanie odnotowany i przy kolejnej próbie wykona się ponownie.

Budowa tabeli — wykaz kolumn

Struktura jest celowo minimalna — do odtworzenia stanu migracji potrzeba wyłącznie nazwy skryptu i momentu jego wykonania.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
Applieddatetime
data i godzina
takData i godzina pomyślnego wykonania skryptu na tej bazie
Idint
liczba całkowita
takKolejny numer wpisu nadawany automatycznie, klucz główny tabeli
ScriptNamenvarchar(127)
tekst do 127 znaków
takPełna nazwa pliku skryptu wraz z przedrostkiem porządkowym — jedyny identyfikator rozpoznający skrypt jako wykonany

Kolumna ScriptName przechowuje pełną nazwę pliku wraz z przedrostkiem porządkowym. To ona, a nie identyfikator liczbowy, decyduje o rozpoznaniu skryptu jako wykonanego.

Indeksy i wydajność zapytań

Tabela jest odczytywana raz na uruchomienie migracji i zawiera zwykle od kilkudziesięciu do kilkuset wierszy, dlatego nie wymaga rozbudowanego indeksowania.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
PK__dbup_IdIdklucz główny

Klucz główny na kolumnie Id zapewnia jednoznaczność wiersza. Przy bardzo długiej historii migracji warto rozważyć indeks unikalny na ScriptName — wymusza on brak duplikatów i przyspiesza porównanie listy.

Typowe kłopoty i sposób ich rozwiązania

Awarie mechanizmu migracji niemal zawsze sprowadzają się do rozbieżności między tym, co zapisano w tabeli, a tym, co faktycznie znajduje się w schemacie. Poniżej najczęstsze przypadki spotykane przy utrzymaniu instalacji StudioSystem.

Rozbieżności między historią migracji a stanem bazy
ObjawPrawdopodobna przyczynaPostępowanie
Skrypt wykonuje się przy każdym uruchomieniuNazwa pliku została zmieniona po jego wykonaniuPrzywrócić pierwotną nazwę albo dopisać nową do tabeli, jeśli zmiana jest już w bazie
Migracja przerywa się błędem „obiekt już istnieje”Zmianę wprowadzono ręcznie, z pominięciem skryptuDopisać nazwę skryptu do tabeli po sprawdzeniu, że schemat odpowiada jego treści
Nowa kolumna nie pojawiła się mimo udanej migracjiSkrypt trafił do katalogu po zakończeniu wdrożeniaUruchomić migrację ponownie — brakujący plik zostanie wykonany
Ta sama nazwa skryptu występuje dwa razyRęczna edycja tabeli lub scalenie dwóch gałęzi zmianUsunąć duplikat i rozważyć indeks unikalny na kolumnie ScriptName

Wspólny mianownik wszystkich przypadków: nazwa pliku jest jedynym identyfikatorem skryptu, więc jej zmiana zawsze ma konsekwencje.

Zasada nadrzędna brzmi: skryptu, który został już wykonany na jakiejkolwiek bazie, nie modyfikuje się. Poprawkę wprowadza się nowym plikiem. Odstępstwo od tej reguły powoduje, że środowiska przestają być porównywalne, a odtworzenie bazy od zera daje inny wynik niż jej aktualizacja.

Jak korzystać z tabeli w praktyce

Przy pracy z historią migracji warto pamiętać o kilku rzeczach:

  • Wykonuj migrację najpierw na kopii bazy produkcyjnej — na środowisku testowym o innej historii wynik może być mylący.
  • Rób kopię zapasową przed uruchomieniem skryptów zmieniających typy kolumn lub usuwających obiekty; migracja nie ma funkcji cofnięcia.
  • Nie zmieniaj nazw plików już odnotowanych w tabeli — to najczęstsza przyczyna ponownego wykonania skryptu.
  • Poprawki wprowadzaj nowym skryptem zamiast edycji istniejącego, nawet gdy chodzi o drobiazg.
  • Traktuj ręczne dopisanie wiersza jako operację wyjątkową i odnotowuj jej powód poza bazą — po pół roku nikt nie odtworzy motywu z samej tabeli.
  • Sprawdzaj datę ostatniej migracji przy diagnozie różnic między środowiskami; rozbieżność zwykle tłumaczy odmienne zachowanie aplikacji.

Zapytanie pokazujące ostatnio wykonane skrypty wraz z czasem, jaki upłynął od ich wprowadzenia:

SELECT TOP (20)
       Id,
       ScriptName,
       Applied,
       DATEDIFF(DAY, Applied, GETDATE()) AS DNI_TEMU
FROM   dbo._dbup
ORDER BY Applied DESC, Id DESC;

Porównanie wyniku tego zapytania na dwóch środowiskach jest najszybszym sposobem ustalenia, czym różnią się ich schematy.

Osobną sprawą, o której łatwo zapomnieć, jest nazewnictwo plików. Kolejność wykonania wynika z nazwy, więc przedrostek musi ją jednoznacznie ustalać — najczęściej stosuje się datę w formacie rocznym z numerem porządkowym. Nazwy typu poprawka.sql albo fix2.sql działają dopóty, dopóki nad bazą pracuje jedna osoba; przy dwóch równoległych gałęziach zmian kolejność przestaje być przewidywalna, a skutek migracji zależy od tego, kto wdrażał jako pierwszy.

Tabela migracji bywa pomijana w dokumentacji, bo nie zawiera danych biznesowych. W praktyce to jednak pierwsze miejsce, do którego zagląda się przy pytaniu „dlaczego na tym środowisku działa inaczej”. Zestawienie jej zawartości z dwóch instalacji odpowiada na nie szybciej niż porównywanie samych schematów.

Powiązane tabele i dokumentacja

Historia migracji łączy się z pozostałymi mechanizmami wersjonowania i konfiguracji systemu:

FAQ

Najczęściej zadawane pytania o tabelę _dbup

01

Co się stanie, gdy uruchomię migrację dwa razy?

Nic. Narzędzie porówna listę plików z zawartością tabeli i stwierdzi, że wszystkie zostały już wykonane. Odporność na ponowne uruchomienie jest podstawową cechą tego mechanizmu i pozwala włączyć migrację do standardowej procedury wdrożenia.

02

Dlaczego nie wolno zmieniać nazwy wykonanego skryptu?

Bo nazwa pliku jest jedynym identyfikatorem skryptu. Po jej zmianie narzędzie nie rozpozna pliku jako wykonanego i uruchomi go ponownie — na bazie, w której odpowiadające zmiany już istnieją. Kończy się to zwykle błędem o istniejącym obiekcie i przerwaniem całej migracji.

03

Czy można cofnąć wykonaną migrację?

Nie w ramach samego mechanizmu — tabela odnotowuje wyłącznie fakt wykonania. Wycofanie zmiany wymaga albo odtworzenia bazy z kopii zapasowej, albo napisania nowego skryptu odwracającego skutki poprzedniego. Stąd zalecenie wykonywania kopii przed migracjami zmieniającymi strukturę.

04

Kiedy dopisanie wiersza ręcznie jest uzasadnione?

Gdy zmiana opisana w skrypcie została już wprowadzona w bazie inną drogą i skrypt zakończyłby się błędem. Przed dopisaniem trzeba jednak zweryfikować, że schemat rzeczywiście odpowiada treści skryptu w całości — częściowa zgodność da bazę pozornie aktualną, ale niekompletną.

Słownik pojęć

Słownik pojęć

Pojęcia związane z wersjonowaniem schematu bazy danych.

MMicrosoft SQL Server
Serwer relacyjnej bazy danych, na którym pracują aplikacje SoftwareStudio. Odpowiada za spójność danych, uprawnienia dostępu, kopie zapasowe i wydajność zapytań.
MMigracja danych
Przeniesienie kartotek i historii ze starego systemu do nowego. Etap, na którym najczęściej ujawnia się rzeczywista jakość danych w firmie.
KKopia zapasowa
Zabezpieczona kopia bazy danych pozwalająca odtworzyć stan systemu po awarii. W SQL Server wykonuje się ją w trybie pełnym, różnicowym lub jako kopię dziennika transakcji.
WWdrożenie
Proces uruchomienia systemu w firmie: analiza procesów, konfiguracja, migracja danych, szkolenia i uruchomienie produkcyjne.
AAktualizacja wersji
Wgranie nowego wydania oprogramowania wraz ze zmianami wynikającymi z przepisów. Wymaga testów na kopii bazy przed wdrożeniem produkcyjnym.
IIndeks bazodanowy
Struktura przyspieszająca wyszukiwanie wierszy w tabeli. Dobrze dobrane indeksy skracają czas zapytań, ale spowalniają zapisy i zajmują miejsce na dysku.

Zobacz to w praktyce

Sprawdź, jak systemy SoftwareStudio oparte na MS SQL Server wspierają ten obszar Twojej firmy.