Konfigurowanie kontroli źródła i zarządzanie danymi referencyjnymi

Ukończone

Projekt bazy danych SQL bez kontroli źródła to tylko folder plików na maszynie innej osoby. W momencie, gdy zepsuje się laptop tej osoby lub gdy dwóch deweloperów edytuje tę samą procedurę składowaną, wracasz do punktu wyjścia. Umieszczenie projektu w Git zapewnia historię zmian, współpracę poprzez rozgałęzianie i żądania ściągnięcia oraz podstawy każdego potoku ciągłej integracji/ciągłego wdrażania.

Ale sama kontrola źródła nie rozwiązuje wszystkiego. Baza danych prawdopodobnie zawiera tabele odnośników, kody stanu i domyślne konfiguracje, które działają obok schematu. Potrzebujesz również strategii dla tych danych.

Konfigurowanie kontroli źródła dla projektu bazy danych SQL

Ponieważ projekt bazy danych SQL to tylko .sql pliki i .sqlproj plik, pasuje naturalnie do usługi Git. Każdy obiekt bazy danych znajduje się we własnym pliku, więc usługa Git śledzi zmiany na poziomie obiektu. Zatwierdzenie, które modyfikuje tabelę Customers i aktualizuje procedurę składowaną, pokazuje dokładnie te dwa pliki w różnicy, a nie monolityczny skrypt migracji z dziesiątkami niepowiązanych zmian.

Aby rozpocząć, zainicjuj repozytorium Git w folderze projektu:

cd MyDatabaseProject
git init
git add .
git commit -m "Initial commit of database project"

Organizowanie folderu projektu

Spójna struktura folderów sprawia, że projekt jest nawigowalny w skrócie. Najczęściej spotykane pliki wzorców grupuje według typu obiektu:

MyDatabaseProject/
├── MyDatabaseProject.sqlproj
├── Tables/
│   ├── Customers.sql
│   └── Orders.sql
├── Views/
│   └── vw_ActiveCustomers.sql
├── StoredProcedures/
│   └── usp_GetCustomerOrders.sql
├── Scripts/
│   ├── PostDeployment/
│   │   └── seed-data.sql
│   └── PreDeployment/
│       └── prep-db.sql
└── PostDeploy.sql

W przypadku projektów w stylu zestawu SDK domyślny wzorzec globbing automatycznie pobiera każdy .sql plik w folderze. Nie są potrzebne żadne ręczne wpisy do pliku.

Dodaj plik .gitignore

Zachowaj repozytorium skoncentrowane na plikach źródłowych, wykluczając dane wyjściowe kompilacji i ustawienia specyficzne dla użytkownika:

bin/
obj/
*.dacpac
*.user

Element .dacpac jest odtwarzany z projektu przy każdym budowaniu CI/CD, więc nie ma powodu, aby śledzić go w Git.

Zarządzanie danymi referencyjnymi za pomocą skryptów przed wdrożeniem i po wdrożeniu

Model deklaratywny obsługuje obiekty schematu, takie jak tabele, widoki i procedury składowane, ale niektóre dane są tak istotne, jak sam schemat. Kody stanu, tabele odnośników, konfiguracje domyślne, listy regionów. Jeśli te dane znikną, aplikacja przestanie działać. Należy on do projektu, wersjonowany wraz z obiektami, które od niego zależą.

Wdrożenie wstępne i skrypty po wdrożeniu rozwiążą ten problem. Są to skrypty SQL wykonywane podczas wdrażania, ale znajdują się poza skompilowanym modelem bazy danych:

  • Skrypt przed wdrożeniem jest uruchamiany przed planem wdrożenia. Służy do wykonywania zadań, które muszą zostać wykonane przed zmianami schematu, takich jak porzucanie ograniczeń lub migrowanie danych.
  • Skrypt po wdrożeniu jest uruchamiany po zakończeniu planu wdrożenia. Służy do wypełniania danych referencyjnych, tabel wyszukiwania lub ustawiania domyślnych wartości aplikacji.

Dodawanie skryptów do projektu

Projekt obsługuje dokładnie jeden skrypt wdrażania wstępnego i jeden skrypt po wdrożeniu. Zadeklarujesz je w pliku .sqlproj z wpisami elementów: PreDeploy, PostDeploy.

<ItemGroup>
    <PreDeploy Include="prep-db.sql" />
</ItemGroup>
<ItemGroup>
    <PostDeploy Include="PostDeploy.sql" />
</ItemGroup>

Używanie funkcji SQLCMD obejmuje wiele plików danych

Jeden plik skryptu nie oznacza jednego gigantycznego pliku. Użyj składni SQLCMD :r , aby ściągnąć wiele plików z jednego punktu wejścia. Typowy wygląd PostDeploy.sql wygląda następująco:

:r .\Scripts\PostDeployment\seed-statuses.sql
:r .\Scripts\PostDeployment\seed-regions.sql
:r .\Scripts\PostDeployment\seed-app-settings.sql

Każdy przywołyny plik musi zostać wykluczony z kompilacji. W przeciwnym razie proces kompilacji próbuje skompilować go jako obiekt schematu i zakończy się niepowodzeniem. .sqlproj W pliku użyj Build Remove, aby zapobiec kompilacji i None Include zachować plik widoczny w projekcie.

<ItemGroup>
    <Build Remove="Scripts\PostDeployment\seed-statuses.sql" />
    <None Include="Scripts\PostDeployment\seed-statuses.sql" />
</ItemGroup>

📝 Powtórz ten wzorzec dla każdego pliku, do którego się odnosisz w skryptach przedwdrożeniowych lub powdrożeniowych.

Pisanie idempotentnych skryptów danych referencyjnych

Skrypty po wdrożeniu są uruchamiane w każdym wdrożeniu, a nie tylko przy pierwszym. Jeśli używasz zwykłych INSERT instrukcji, drugie wdrożenie zakończy się niepowodzeniem z powodu zduplikowanych naruszeń klucza. Zamiast tego użyj MERGE instrukcji , aby skrypty były bezpieczne do wielokrotnego uruchamiania:

MERGE INTO [dbo].[OrderStatuses] AS target
USING (VALUES
    (1, N'Pending'),
    (2, N'Processing'),
    (3, N'Shipped'),
    (4, N'Delivered'),
    (5, N'Cancelled')
) AS source ([StatusID], [StatusName])
ON target.[StatusID] = source.[StatusID]
WHEN MATCHED THEN
    UPDATE SET [StatusName] = source.[StatusName]
WHEN NOT MATCHED THEN
    INSERT ([StatusID], [StatusName])
    VALUES (source.[StatusID], source.[StatusName]);

Wskazówka

Skrypty przed wdrożeniem i po wdrożeniu można zweryfikować po kompilacji projektu, zmieniając rozszerzenie pliku z .dacpac na .zip, a następnie go wyodrębniając. Pojedynczy .sql plik dla każdego typu skryptu zawiera połączoną zawartość języka T-SQL ze wszystkich plików, do których się odwołujesz.

Kluczowe wnioski

Zainicjuj repozytorium Git na poziomie rozwiązania i użyj pliku .gitignore, aby wykluczyć dane wyjściowe kompilacji, takie jak bin/, obj/ i .dacpac. Organizuj obiekty schematu w foldery, które dublują strukturę bazy danych, z jednym plikiem na obiekt. Umieść dane referencyjne w skryptach po wdrożeniu i użyj funkcji SQLCMD :r , aby zachować każdy skrypt skoncentrowany na jednej tabeli. Aby zapobiec kompilowaniu skryptów danych jako obiektów schematu, użyj polecenia Build Remove i None Include w .sqlproj pliku . Pisz MERGE instrukcje zamiast zwykłych INSERT instrukcji, dzięki czemu skrypty danych referencyjnych są idempotentne i bezpieczne do uruchamiania w każdym wdrożeniu. Następnie zacznij korzystać z tego repozytorium z rozgałęzianiem i przepływami żądań pull.