Porównywanie danych – cz. II (dane właściwe)

W pierwszej części poruszałem temat porównywania struktury bazy danych. Drugim ważnym zagadnieniem jest porównywanie zawartości bazy danych. Istnieje kilka sposobów na wykonanie tego zadania, ale chciałbym zaprezentować w tym wątku narzędzie dołączane bezpłatnie do Microsoft SQL Server. Narzędzie to nosi nazwę tablediff. Jest to narzędzie, które dokonuje porównania dwóch tabel wiersz po wierszu w miejscu uruchomienia dla Microsoft SQL Server. Specjalnie nadmieniam, że porównywanie dokonywane jest w miejscu uruchomienia, dlatego że może to mieć krytyczne znaczenie w przypadku gdy mamy do czynienia z porównywaniem sporej liczby rekordów. Jeśli zarówno tabela źródłowa jak i docelowa znajdują się na różnych serwerach niż miejsce, z którego uruchamiamy tablediff nastąpi pobranie tych danych na tę właśnie maszynę.

Uruchomienie tablediff wymaga podania obowiązkowo sześć parametrów po trzy dla serwera źródłowego i trzy dla serwera docelowego, w tym: adres/nazwa serwera, nazwa bazy, nazwa tabeli:

  • sourceserver nazwa_serwera_zrodlowego[\nazwa_instancji]
  • sourcedatabase nazwa_bazy_zrodlowej
  • sourcetable nazwa_tabeli_zrodlowej
  • destinationserver nazwa_serwera_docelowego[\nazwa_instancji]
  • destinationdatabase nazwa_bazy_docelowej
  • destinationtable nazwa_tabeli_docelowej

Istnieje szereg dodatkowych parametrów, które mogą być przydatne. Pełną specyfikację parametrów znajdziemy na msdn.

Kilka interesujących informacji dotyczących działania tablediff to:

  • istnieje możliwość porównania dwóch tabel tylko w obrębie instancji Microsoft SQL Server;
  • można porównać tabele w obrębie tej samej bazy (wystarczy wskazać jako serwer źródłowy i docelowy te same instancje oraz bazę źródłową i docelową te same bazy);
  • wymagane są uprawnienia SELECT ALL dla porównywanych tabel;
  • możliwe jest wygenerowanie skryptu, który zsynchronizuje dane w tabeli docelowej na podstawie tabeli źródłowej;
  • domyślnie wspierane jest mapowanie między typami w tabeli źródłowej a typtami w tabeli docelowej (np. int na bigint, varchar(max) na text); można wyłączyć tę opcję przełącznikiem –strict
  • narzędzie tablediff.exe przy domyślnej instalacji można odnaleźć w folderze: C:\Program Files\Microsoft SQL Server\NNN\COM, gdzie NNN to numer wersji SQL Server, czyli np. 130 dla Microsoft SQL Server 2016;
  • nie wspierany jest typ danych sql_variant.

Działanie tablediff najlepiej zobaczyć w działaniu. Zacznijmy zatem od przygotowania bazy, w której będą dwie tabele: SourceTable oraz DestinationTable:

Można zauważyć, że w DestinationTable brakuje wpisu o ID=4, ponadto dla wpisu o ID=2 występuje inna nazwa. W celu uruchomienia narzędzia tablediff należy uruchomić wiersz poleceń, a następnie przejść do katalogu, w którym znajduje się tablediff i wykonać następujące polecenie:

Widzimy, że pomiędzy tabelami występują różnice. Dwa wpisy o tych samych identyfikatorach mają różne wartości, wskazane są także identyfikatory rekordów występujących jedynie w źródle i w tabeli docelowej. Warto zwrócić uwagę, że można przy wykorzystaniu przełącznika -o (od output) przekierować wynik działania tablediff do pliku tekstowego:

Plik ten wygląda następująco:

Jak można dokonać synchronizacji danych? Narzędzie tablediff potrafi wygenerować skrypt, który wykona całą pracę za nas. Wystarczy skorzystać z przełącznika -f (od file), który wygeneruje plik z zapytaniem T-SQL.

A czy jest możliwe porównanie wszystkich tabel w obrębie dwóch baz danych? Można tego dokonać przygotowując odpowiedni skrypt. Opis tego pomysłu można odnaleźć pod adresem: http://sqlserveradvisor.blogspot.com/2009/06/tablediff-howto-compare-database-tables.html. Pomysł ten jest dość prosty. Polega na wykorzystaniu widoku INFORMATION_SCHEMA.TABLES i przygotowaniu dla każdej z nich z wykorzystaniem kursora polecenia, które należy wykonać.

Źródła:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *