Generowanie skryptu zmian czyli Visual Studio Schema Compare

Dziś chciałbym napisać parę słów na temat porównania dwóch baz danych pod kątem różnic w definicji obiektów. Jest to dosyć częsta praktyka gdy chcemy porównać bazy pomiędzy np. środowiskiem deweloperskim i produkcyjnym. Kiedyś do tego typu operacji potrzebowaliśmy narzędzi firm trzecich, obecnie możemy do tego wykorzystać standardową funkcjonalność Visual Studio.

Na samym początku musimy mieć co porównywać dlatego też stwórzmy sobie dwie bazy danych. Skrypt pierwszej z nich przedstawia się następująco:

USE master
GO

CREATE DATABASE Database1
GO

USE Database1
GO

CREATE TABLE dbo.Table1
(
Id int,
Name varchar(200),
BirthDate datetime,
IsEmployee bit
)
GO

CREATE VIEW dbo.View1
AS
SELECT
	ID,
	Name,
	BirthDate
FROM
	dbo.Table1
WHERE
	IsEmployee=1
GO

CREATE PROC dbo.Proc1 @Id int, @Name varchar(200),@BirthDate datetime
AS
Insert Into dbo.Table1
(Id,Name,BirthDate)
VALUES
(
@Id,@Name,@BirthDate
)
GO
CREATE TABLE dbo.Table0
(
Id int,
Name varchar(200),
BirthDate datetime
)
GO

Skrypt drugiej bazy wygląda następująco:

USE master
GO

CREATE DATABASE Database2
GO

USE Database2
GO

CREATE TABLE dbo.Table1
(
Id int,
Name varchar(200),
BirthDate datetime
)
GO

CREATE VIEW dbo.View1
AS
SELECT
	ID,
	Name,
	BirthDate
FROM
	dbo.Table1
GO

CREATE PROC dbo.Proc1 @Id int, @Name varchar(200),@BirthDate date
AS
Insert Into dbo.Table1
(Id,Name,BirthDate)
VALUES
(
@Id,@Name,@BirthDate
)
--Ta procedura wstawia rekordy do tabeli dbo.Table1
GO

CREATE TABLE dbo.Table2
(
Id int,
Name varchar(200),
BirthDate datetime
)
GO
CREATE TABLE dbo.Table3
(
Id int,
Name varchar(200),
BirthDate datetime
)
GO

W niniejszym artykule będę używał Data Tools for Visual Studio 2015. Podstawą do zrobienia porównania będzie stworzenie nowego projektu bazodanowego – czyli z sekcji Templates wybieramy SQL Server tak jak zostało to przedstawione na poniższym zrzucie ekranowym.

Po krótkiej chwili projekt zostanie utworzony – wtedy też wybieramy Tools->SQL Server->New Schema Comparison:

Naszym oczom powinien ukazać się ekran porównywania schematów baz danych. Na początku musimy ustawić połączenie do pierwszej bazy wybierając z listy rozwijanej Select Source…

Bardzo ważne jest zdefiniowanie tego co ma być źródłem (Source), a co miejscem docelowym (Target). Jest to istotne dlatego, iż w późniejszym czasie będziemy mogli wygenerować skrypt różnicowy, który zmodyfikuje bazę docelową aby była taka sama jak baza źródłowa. Możemy połączyć się do projektu bazodanowego stworzonego właśnie w Visual Studio, bezpośrednio do bazy danych lub też do pliku aplikacji Data-tier. Na ten moment interesuje nas połączenie bezpośrednie dlatego też klikamy Select connection

Samo nawiązanie połączenia jest dosyć proste – wystarczy wpisać adres serwera, sposób uwierzytelnienia i bazę danych:

Po nawiązaniu połączenia możemy przejść do opcji porównywania klikając Compare. Wcześniej jednak polecam kliknąć przycisk opcji oznaczony poniżej, który pozwoli zaznaczyć ważne opcje jak np. to aby skrypt różnicowy nie generował skryptu, który może powodować stratę danych, usunięcie wyzwalaczy czy indeksów itp. Na ten moment zaufajmy domyślnym ustawieniom i kliknijmy Compare.

Po krótkiej chwili naszym oczom pojawi się zestawienie różnic pomiędzy bazami podobne do poniższego:

Jak widać każda różnica została zakwalifikowana do trzech grup:

  • Delete – w bazie docelowej trzeba usunąć obiekty z tej grupy,
  • Change – w bazie docelowej trzeba zmienić obiekty z tej grupy
  • Add – w bazie docelowej trzeba dodać obiekty z tej grupy

Jeżeli chcemy zobaczyć czym określone elementy w sekcji Change się różnią, to po kliknięciu na konkretny obiekt w dolnej części ekranu pojawi się podkreślenie dokładnie w którym miejscu dany element się różni:

W przypadku długich skryptów każda zmiana jest oznaczona na pasku po lewej stronie. Dodatkowo jeśli użyjemy paska przewijania to oba podglądy zostaną w przewinięte synchronicznie – co nieco upraszcza pracę. Gdy już wiemy które obiekty chcemy zsynchronizować to zaznaczamy checkboxa przy ich nazwie i klikamy przycisk generowania skryptu różnicowego:

w rezultacie otrzymamy skrypt różnicowy synchronizujący bazę docelową z bazą źródłową.

Tego typu podejście do wrzucania skryptów na serwer docelowy bywa użyteczne. Mimo wszystko jednak pamiętajmy o tym, że jest to “automat” więc nie należy mu bezgranicznie ufać i podejść do tego rozsądnie. Osobiście bardzo często używam tego narzędzia do porównywania bazy danych pomiędzy środowiskiem developerskim a produkcyjnym – wam również to zalecam gdyż jest to o wiele bardziej ustandaryzowane podejście niż własne skrypty porównujące lub (o zgrozo) ręczne sprawdzanie zmian.

 

Leave a Reply