Niektóre typy danych zmieniały zachowanie między wersjami SQL Server, co warto sprawdzić przed migracją.
Typy danych wprowadzone w SQL Server 2008
Przy porównywaniu schematów między wersjami SQL Server warto najpierw rozróżnić typy dostępne od dawna od typów wprowadzonych w konkretnych wydaniach silnika. SQL Server 2008 dodał między innymi typy date, time, datetime2 i datetimeoffset. Wcześniejszy typ datetime przechowuje datę i czas z dokładnością około 3,33 milisekundy, natomiast datetime2 pozwala określić precyzję od 0 do 7 cyfr części ułamkowej sekundy. Typ date przechowuje wyłącznie datę, a time wyłącznie godzinę. Dzięki temu migracja z wcześniejszego modelu opartego na datetime może wymagać zmiany zapytań, parametrów i mapowania typów w aplikacji.
datetimeoffset przechowuje datę, czas oraz przesunięcie względem czasu UTC, na przykład +01:00 albo +02:00. Nie jest to jednak typ przechowujący nazwę strefy czasowej ani reguły przejścia na czas letni. Podczas migracji trzeba więc ustalić, czy aplikacja zapisuje rzeczywisty punkt w czasie, lokalną datę i godzinę, czy tylko informację o przesunięciu. Zmiana kolumny z datetime na datetime2 może poprawić zakres i dokładność zapisu, ale nie odtworzy informacji o strefie czasowej, której wcześniej nie zapisano.
Typy przestarzałe i ich zamienniki
SQL Server nadal rozpoznaje typy text, ntext i image, ale są one oznaczone jako przestarzałe i nie powinny być stosowane w nowych tabelach. Ich funkcjonalne zamienniki to odpowiednio varchar(max), nvarchar(max) oraz varbinary(max). Typy z przyrostkiem max mogą przechowywać wartości większe niż zwykłe typy o ograniczonym rozmiarze, a jednocześnie obsługują współczesne funkcje operowania na dużych wartościach znakowych lub binarnych.
W migracji nie wystarczy mechanicznie podmienić deklaracji kolumn. Typy text i ntext mają odrębne ograniczenia dotyczące części funkcji i operatorów, dlatego po zmianie należy sprawdzić procedury składowane, wyzwalacze, widoki oraz kod aplikacji. Istotne są także parametry procedur i wartości zwracane przez funkcje. Przykładowo użycie varchar(max) zamiast text może wymagać zmiany deklaracji parametru, konwersji w zapytaniu lub sposobu odczytu danych przez sterownik. Kolumn typu image nie należy mylić z formatem pliku graficznego; jest to ogólny typ danych binarnych, którego zamiennikiem jest varbinary(max).
Osobnego wyjaśnienia wymaga słowo kluczowe timestamp. W SQL Server nie oznacza ono daty ani godziny. Jest historycznym synonimem typu rowversion, który przechowuje automatycznie generowaną wartość binarną używaną do wykrywania zmian w wierszu. Wartość rowversion nie jest gwarantowanym czasem wykonania operacji i nie powinna być konwertowana na datę. W nowych definicjach zaleca się używanie jednoznacznej nazwy rowversion, ponieważ timestamp może prowadzić do błędnej interpretacji przez programistów i narzędzia migracyjne.
Różnice typów podczas konwersji i porównywania
Zmiana wersji SQL Server może ujawnić problemy wynikające nie z samej dostępności typu, lecz z konwersji, precyzji i reguł porównywania. Konwersja z datetime do datetime2 nie odzyska dokładności utraconej podczas wcześniejszego zapisu. Z kolei konwersja wartości z większą precyzją do starszego typu może zaokrąglić albo obciąć część ułamkową sekundy. Przy migracji danych należy porównać wartości przed i po konwersji, zwłaszcza gdy są używane w warunkach zakresowych, sortowaniu, synchronizacji lub identyfikowaniu ostatniej zmiany.
Znaczenie ma również długość i typ tekstu. varchar służy do danych znakowych przechowywanych w kodowaniu strony kodowej kolumny, natomiast nvarchar przeznaczono dla danych Unicode. Literał znakowy bez prefiksu N może zostać potraktowany jako wartość nieunikodowa; dla tekstu Unicode używa się zapisu takiego jak N'Łódź'. Konwersje między varchar i nvarchar mogą prowadzić do utraty znaków, jeżeli strona kodowa nie reprezentuje całego tekstu. Trzeba też sprawdzić długości parametrów, ponieważ niejawne konwersje w predykatach mogą zmieniać plan wykonania i zwiększać koszt odczytu.
Podczas przejścia na nowszą wersję warto sprawdzić także ustawienia poziomu zgodności bazy danych. Poziom zgodności nie zmienia definicji wszystkich typów, ale wpływa na zachowanie części składni, optymalizatora i funkcji języka T-SQL. Bezpośrednią kontrolę schematu można rozpocząć od zapytań do widoków katalogowych, na przykład sys.columns, sys.types i sys.objects. Pozwala to wykryć kolumny używające typów przestarzałych, a następnie przeanalizować zależności przed wykonaniem ALTER TABLE.
Bezpieczna weryfikacja schematu przed migracją
Przed zmianą wersji SQL Server należy sporządzić listę kolumn, parametrów, zmiennych i wyników funkcji, które korzystają z typów zależnych od historii silnika. W praktyce trzeba objąć kontrolą nie tylko tabele, ale także procedury składowane, funkcje, widoki, indeksy, klucze, ograniczenia i definicje aplikacji przechowywane poza bazą. Wyszukiwanie samych nazw typów w skryptach może nie wykryć typów odziedziczonych przez aliasy, typy użytkownika albo narzędzia generujące schemat automatycznie.
Każdą konwersję należy wykonać na kopii bazy lub środowisku testowym z reprezentatywnymi danymi. Należy porównać liczbę wierszy, wartości graniczne, wartości NULL, długości tekstów, dane binarne oraz wyniki kluczowych zapytań. Dla kolumn daty i czasu trzeba sprawdzić wartości z końca dnia, ułamki sekund i przesunięcia zapisane w datetimeoffset. Dla tekstu trzeba przetestować znaki diakrytyczne i Unicode. Po zmianie należy ponownie utworzyć lub zweryfikować indeksy oraz przejrzeć plan zapytań, ponieważ zmiana typu może wpływać na rozmiar danych, konwersje niejawne i wybór operatorów przez optymalizator.
W środowisku SQL Server diagnostyka problemu po migracji powinna zaczynać się od identyfikacji konkretnego typu, wersji silnika, poziomu zgodności i miejsca wystąpienia konwersji. Komunikat o niezgodności nie zawsze oznacza uszkodzenie danych; może wskazywać na nieobsługiwaną składnię, niejawne rzutowanie albo różnicę między typem kolumny a typem parametru. W przypadku komputerów używanych do pracy z bazą ważne jest również sprawdzenie sterownika i biblioteki klienta, ponieważ aplikacja może mapować typy SQL Server na niewłaściwe typy języka programowania. Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów i komputerów PC, w tym diagnostyką podzespołów wykorzystywanych do pracy z oprogramowaniem bazodanowym.