DbUp – aktualizacja baz danych

DbUp jest prostą biblioteką, przeznaczoną do aktualizacji baz danych. Jeśli korzystamy z ORM, zwykle wtedy dany framework posiada już analogiczną funkcjonalność. Na przykład, EntityFramework wspiera migrację, która umożliwia automatyczną aktualizacje tabel i procedur.

Z drugiej strony, nie zawsze jest potrzeba korzystania z tak ciężkich rozwiązań. Bardzo popularną biblioteką do odczytu danych z baz jest Dapper.  Niestety nie posiada on mechanizmu podobnego do Entity Framework migrations.

W takich przypadkach, DbUp jest bardzo przydatny. Aktualnie wspiera kilka baz danych m.in. SQL Server, MySQL i FireBird. Idea jest bardzo prosta – wystarczy w projekcie stworzyć folder z listą skryptów do wykonania.  Załóżmy, że mamy 2 skrypty :

CREATE TABLE [dbo].Persons
(
   [Id] INT NOT NULL PRIMARY KEY, 
    [FirstName] NCHAR(10) NULL, 
    [LastName] NCHAR(10) NULL
)

CREATE TABLE [dbo].Articles
(
	[Id] INT NOT NULL PRIMARY KEY, 
    [Title] NCHAR(10) NULL, 
    [Content] NCHAR(500) NULL
)

Każdy ze skryptów powinien zostać zapisany w osobnym pliku, np.:

1

Następnie należy ustawić Build Action na Embedded Resource:

2
Oczywiście jeśli chcemy, aby DbUp wykonał powyższe skrypty, należy zainstalować odpowiedni pakiet za pomocą:
Install-Package DbUp

W celu uruchomienia aktualizacji wystarczy:

            var connectionString = @"Server=DESKTOP-IK0BKOF\SQLEXPRESS;database=testdb; Trusted_connection=true";

            var upgrader =
                DeployChanges.To
                    .SqlDatabase(connectionString)
                    .WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly())
                    .LogToConsole()
                    .Build();

            var result = upgrader.PerformUpgrade();

            if (!result.Successful)
                Console.WriteLine(result.Error);

DbUp automatycznie połączy się z bazą i wykona skrypt po skrypcie:

3

Jeśli ponownie spróbujemy wykonać aktualizację, wtedy DbUp zorientuje się, że nie trzeba już żadnych skryptów wykonywać:

4

Załóżmy, że po pewnym czasie dodaliśmy kolejną tabelę:

CREATE TABLE [dbo].Contacts
(
	[Id] INT NOT NULL PRIMARY KEY, 
    [FirstName] NCHAR(10) NULL, 
    [LastName] NCHAR(10) NULL
)

5
Po uruchomieniu, DbUp doda wyłącznie nową tabelę (Contacts):

6

Pozostaje wyjaśnij, w jaki sposób DbUp wie, które skrypty należy wykonywać? Zaglądając do bazy danych, zobaczymy, że nowa tabela “SchemaVersions” została utworzona. Wykonując Select na niej, przekonamy się,  że DbUp przechowuje listę skryptów, które zostały wykonane:

7

Oprócz aplikacji konsolowej, można korzystać również ze skryptów PowerShell (szczegóły w dokumentacji). Innym, częstym podejściem jest wykonywanie aktualizacji przed uruchomieniem aplikacji.

Jak widać, DbUp to bardzo proste narzędzie, wykonujące po prostu listę skryptów. Przydaje się jednak w częstych releasach,  gdzie należy pamiętać historię zmian w DB.

4 thoughts on “DbUp – aktualizacja baz danych”

  1. Oczywiście oznacza to, że użytkownik bazodanowy na którym pracuje aplikacja musi mieć uprawnienia do modyfikowania obiektów w bazie danych.
    W aplikacji Windows exe to zapewne jest ok, ale jak to ma się do bezpieczeństwa systemów WWW? Czy takie uprawnienie nie powoduje zbyt wielkiego ryzyka?

  2. Zgadza sie – nie powinno sie tak tego robic. Lepiej odpalic skrypt\aplikacje konsolowa jako jeden z etapow release.

  3. OK. To teraz się zastanawiam dlaczego miałbym używać tego toola skoro mogę zalogować się na bazkę i odpalić skrypty np. na SQL SM i efekt będzie ten sam?

Leave a Reply

Your email address will not be published.