Na wiki społeczności SO odbyła się dyskusja na temat tego, czy obiekty bazy danych powinny podlegać kontroli wersji. Jednak nie widziałem zbyt wielu dyskusji na temat najlepszych praktyk tworzenia procesu automatyzacji kompilacji dla obiektów bazy danych.
To był kontrowersyjny punkt dyskusji dla mojego zespołu - zwłaszcza, że programiści i administratorzy baz danych często mają różne cele, podejścia i obawy podczas oceny korzyści i zagrożeń związanych z automatyzacją wdrażania bazy danych.
Chciałbym usłyszeć kilka pomysłów od społeczności SO na temat praktyk, które okazały się skuteczne w prawdziwym świecie.
Zdaję sobie sprawę, że to, które praktyki są naprawdę najlepsze, jest nieco subiektywne, ale myślę, że dobry dialog o tym, jaka praca może być pomocna dla wielu ludzi.
Oto niektóre z moich zwiastunów pytań dotyczących obszarów zainteresowania w tym temacie. To nie jest ostateczna lista - raczej punkt wyjścia dla ludzi, aby pomóc zrozumieć, czego szukam.
- Czy środowiska testowe i produkcyjne powinny być budowane z kontroli źródła?
- Czy oba powinny być budowane za pomocą automatyzacji - czy też produkcja powinna opierać się na kopiowaniu obiektów ze stabilnego, sfinalizowanego środowiska testowego?
- Jak radzisz sobie z potencjalnymi różnicami między środowiskami testowymi i produkcyjnymi w skryptach wdrożeniowych?
- Jak sprawdzić, czy skrypty wdrożeniowe będą działać równie skutecznie w środowisku produkcyjnym, jak w testach?
- Jakie typy obiektów powinny podlegać kontroli wersji?
- Tylko kod (procedury, pakiety, wyzwalacze, java itp.)?
- Indeksy?
- Ograniczenia?
- Definicje tabel?
- Skrypty zmiany tabeli? (np. ALTER skrypty)
- Wszystko?
- Które typy obiektów nie powinny podlegać kontroli wersji?
- Sekwencje?
- Dotacje?
- Konta użytkowników?
- Jak należy zorganizować obiekty bazy danych w repozytorium SCM?
- Jak radzisz sobie z jednorazowymi rzeczami, takimi jak skrypty konwersji lub skrypty ALTER?
- Jak radzisz sobie z wycofywaniem obiektów z bazy danych?
- Kto powinien być odpowiedzialny za promowanie obiektów z poziomu deweloperskiego do poziomu testowego?
- Jak koordynujesz zmiany wprowadzone przez wielu programistów?
- Jak radzisz sobie z rozgałęzianiem obiektów bazy danych używanych przez wiele systemów?
- Jakie wyjątki, jeśli w ogóle, można rozsądnie wprowadzić w tym procesie?
- Problemy z bezpieczeństwem?
- Dane, których dotyczy brak identyfikacji?
- Skrypty, których nie można w pełni zautomatyzować?
- W jaki sposób można uczynić proces odpornym i wykonalnym?
- Do błędu programisty?
- Nieoczekiwane problemy środowiskowe?
- Do odzyskiwania po awarii?
- Jak przekonasz decydentów, że korzyści płynące z DB-SCM naprawdę uzasadniają koszty?
- Dowody anegdotyczne?
- Badania branżowe?
- Zalecenia dotyczące najlepszych praktyk w branży?
- Apelacje do uznanych autorytetów?
- Analiza kosztów i korzyści?
- Kto powinien „posiadać” obiekty bazy danych w tym modelu?
- Deweloperzy?
- DBA?
- Analitycy danych?
- Więcej niż jeden?
źródło
Odpowiedzi:
Oto kilka odpowiedzi na Twoje pytania:
źródło
Jeśli to możliwe, traktuję SQL jako kod źródłowy
Jeśli mogę napisać to w zgodnym ze standardem SQL to zwykle trafia do pliku w mojej kontroli źródła. Plik będzie definiował jak najwięcej, na przykład SP, instrukcje Table CREATE.
Dołączam też fikcyjne dane do testów w kontroli źródła:
Następnie wyodrębniam wszystkie moje zapytania SQL, aby móc zbudować cały projekt dla MySQL, Oracle, MSSQL lub czegokolwiek innego.
Automatyzacja kompilacji i testów wykorzystuje te skrypty kompilacji, ponieważ są one równie ważne jak źródło aplikacji i testują wszystko, od integralności po wyzwalacze, procedury i rejestrowanie.
źródło
Stosujemy ciągłą integrację poprzez TeamCity. Przy każdym meldowaniu się do kontroli źródła baza danych i wszystkie dane testowe są odtwarzane od podstaw, następnie kod, a następnie testy jednostkowe są uruchamiane względem kodu. Jeśli używasz narzędzia do generowania kodu, takiego jak CodeSmith, możesz je również umieścić w procesie kompilacji, aby wygenerować warstwę dostępu do danych na nowo przy każdej kompilacji, upewniając się, że wszystkie warstwy „pasują do siebie” i nie powodują błędów z powodu niezgodne parametry SP lub brakujące kolumny.
Każda kompilacja ma własną kolekcję skryptów SQL, które są przechowywane w katalogu $ project \ SQL \ w kontroli źródła, mają przypisany numeryczny prefiks i są wykonywane w kolejności. W ten sposób ćwiczymy naszą procedurę wdrażania przy każdej kompilacji.
W zależności od tabeli przeglądowej większość naszych wartości wyszukiwania jest również przechowywana w skryptach i uruchamiana, aby upewnić się, że dane konfiguracyjne są zgodne z oczekiwaniami, powiedzmy „kody_przyczyny” lub „kody_kraju”. W ten sposób możemy dokonać zmiany danych wyszukiwania w oprogramowaniu deweloperskim, przetestować je, a następnie „promować” poprzez kontrolę jakości i produkcję, zamiast używać narzędzia do modyfikowania wartości wyszukiwania w środowisku produkcyjnym, co może być niebezpieczne dla czasu pracy.
Tworzymy również zestaw skryptów "przywracania", które cofają zmiany w naszej bazie danych na wypadek, gdyby kompilacja do produkcji uległa awarii. Możesz przetestować skrypty wycofywania, uruchamiając je, a następnie ponownie uruchamiając testy jednostkowe dla wersji kompilacji poniżej Twojej, po uruchomieniu skryptów wdrażania.
źródło
+1 dla Liquibase : LiquiBase to biblioteka typu open source (LGPL) niezależna od bazy danych do śledzenia, zarządzania i stosowania zmian w bazie danych. Jest zbudowany na prostym założeniu: wszystkie zmiany w bazie danych (struktura i dane) są przechowywane w sposób opisowy oparty na XML i sprawdzane w kontroli źródła. Dobrze, że zmiany DML są przechowywane semantycznie, a nie tylko w plikach diff, abyś mógł śledzić cel zmian.
Można go połączyć z kontrolą wersji GIT dla lepszej interakcji. Mam zamiar skonfigurować nasze środowisko dev-prod, aby go wypróbować.
Możesz także użyć systemów kompilacji Maven, Ant do budowania kodu produkcyjnego ze skryptów.
Minusem jest to, że LiquiBase nie integruje się z szeroko rozpowszechnionymi IDE SQL i powinieneś samodzielnie wykonywać podstawowe operacje.
Dodatkowo możesz użyć DBUnit do testowania bazy danych - to narzędzie pozwala na użycie skryptów generujących dane do testowania środowiska produkcyjnego z czyszczeniem w tył.
MOIM ZDANIEM:
Napotkaliśmy wszystkie wymienione problemy ze zmianami kodu, scalaniem, przepisywaniem w naszej produkcyjnej bazie danych rozliczeniowych. Ten temat jest świetny do odkrywania tego wszystkiego.
źródło
Zadając „teaserowe pytania” wydajesz się być bardziej zainteresowany dyskusją niż czyjąś opinią o ostatecznych odpowiedziach. Aktywna lista mailingowa (> 2500 członków) agileDatabases zawiera odpowiedzi na wiele z tych pytań i, z mojego doświadczenia, stanowi wyrafinowane i obywatelskie forum dla tego rodzaju dyskusji.
źródło
Zasadniczo zgadzam się z każdą odpowiedzią udzieloną przez van . Aby uzyskać więcej informacji, moim punktem odniesienia dla zarządzania bazą danych jest seria K. Scotta Allena (lektura obowiązkowa, IMHO. Wydaje się, że także opinia Jeffa ).
Create.sql
. Może to obejmować statyczne wstawianie danych (listy ...).Create.sql
:Create.cmd
. Jego celem jest głównie sprawdzenie wymagań wstępnych (narzędzia, zmienne środowiskowe ...) i przesłanie parametrów do skryptu SQL. Może również ładować zbiorczo dane statyczne z plików CSV w przypadku problemów z wydajnością.Create.cmd
pliku.IMHO, dynamiczne ładowanie danych powinno wymagać innego kroku, w zależności od środowiska. Programiści będą chcieli załadować swoją bazę danych testami, śmieciami lub wcale, podczas gdy z drugiej strony kierownicy produkcji będą chcieli załadować dane produkcyjne. Rozważałbym również przechowywanie danych testowych w kontroli źródła (na przykład w celu ułatwienia testów jednostkowych).
Po wprowadzeniu pierwszej wersji bazy danych do produkcji będziesz musiał nie tylko zbudować skrypty (głównie dla programistów), ale także skrypty upgrade'owe (na tych samych zasadach):
Upgrade.sql
plik (który może wywoływać inne), który umożliwia aktualizację wersji N-1 do wersji N (N to wydana wersja). Przechowuję ten skrypt w folderze o nazwieN-1
.Upgrade.cmd
. Może pobrać aktualną wersję (CV) bazy danych za pomocą prostej instrukcji SELECT, uruchomićUpgrade.sql
skrypt przechowywany wCV
folderze i zapętlić, aż żaden folder nie zostanie znaleziony. W ten sposób możesz automatycznie uaktualnić, powiedzmy, N-3 do N.Problemy z tym to:
Jakiego rodzaju obiekty bazy danych chcesz mieć pod kontrolą źródła? Cóż, powiedziałbym jak najwięcej, ale nie więcej ;-) Jeśli chcesz tworzyć użytkowników z hasłami, podaj im domyślne hasło (login / login, praktyczne do celów testów jednostkowych) i spraw, aby zmiana hasła była operacją ręczną . Dzieje się tak często w przypadku Oracle, gdzie schematy są również użytkownikami ...
źródło
Mamy projekt Silverlight z bazą danych MSSQL w kontroli wersji Git. Najłatwiej jest upewnić się, że masz odchudzoną bazę danych (pod względem zawartości) i wykonać pełny zrzut z np. Programu Visual Studio. Następnie możesz wykonać 'sqlcmd' ze swojego skryptu budującego, aby odtworzyć bazę danych na każdej maszynie deweloperskiej.
W przypadku wdrożenia nie jest to możliwe, ponieważ bazy danych są zbyt duże: to jest główny powód, dla którego warto je umieścić w bazie danych.
źródło
Jestem głęboko przekonany, że baza danych powinna być częścią kontroli źródła iw dużym stopniu częścią procesu budowania. Jeśli jest w kontroli źródła, mam takie same zabezpieczenia kodujące podczas pisania procedury składowanej w SQL, jak podczas pisania klasy w C #. Robię to, dołączając katalog skryptów DB do mojego drzewa źródłowego. Ten katalog skryptów niekoniecznie ma jeden plik dla jednego obiektu w bazie danych. To byłby wrzód na tyłku! Rozwijam się w mojej bazie danych tylko w moim projekcie kodu. Następnie, kiedy jestem gotowy do odprawy, robię różnicę między ostatnią wersją mojej bazy danych a bieżącą, nad którą pracuję. Używam do tego SQL Compare i generuje skrypt wszystkich zmian. Ten skrypt jest następnie zapisywany w moim katalogu db_update z określoną konwencją nazewnictwa 1234_TasksCompletedInThisIteration, gdzie numer jest kolejnym numerem w zestawie skryptów, który już tam jest, a nazwa opisuje, co jest robione podczas tego wpisywania. Robię to w ten sposób, ponieważ część mojego procesu budowania Zaczynam od nowej bazy danych, która jest następnie budowana programowo przy użyciu skryptów w tym katalogu. Napisałem niestandardowe zadanie NAnt, które iteruje przez każdy skrypt wykonując swoją zawartość na czystej bazie danych. Oczywiście, jeśli potrzebuję danych, aby przejść do bazy danych, mam też skrypty wstawiania danych. Ma to również wiele zalet. Po pierwsze, wszystkie moje rzeczy są wersjonowane. Po drugie, każda kompilacja jest świeżą kompilacją, co oznacza, że nie będzie żadnych podstępnych rzeczy, które pojawią się w moim procesie rozwoju (takich jak brudne dane, które powodują dziwności w systemie). Po trzecie, kiedy do zespołu programistów dodaje się nowego faceta, po prostu muszą mieć najnowsze informacje, a ich lokalny programista jest dla nich tworzony w locie. Po czwarte, mogę uruchamiać przypadki testowe (nie nazwałem tego „testem jednostkowym”!) W mojej bazie danych, ponieważ stan bazy danych jest resetowany przy każdej kompilacji (co oznacza, że mogę testować moje repozytoria bez martwienia się o dodawanie danych testowych do db).
To nie jest dla każdego.
To nie jest dla każdego projektu. Zwykle pracuję nad projektami od podstaw, co pozwala mi na taką wygodę!
źródło
Zamiast wdawać się w kłótnie z białą wieżą, oto rozwiązanie, które bardzo dobrze się sprawdziło w przypadku rzeczywistych problemów.
Budowanie bazy danych od podstaw można podsumować jako zarządzanie skryptami sql.
DBdeploy to narzędzie, które sprawdzi aktualny stan bazy danych - np. Jakie skrypty były wcześniej uruchamiane, jakie skrypty są dostępne do uruchomienia, a zatem jakie skrypty są potrzebne do uruchomienia.
Następnie zestawi razem wszystkie potrzebne skrypty i uruchomi je. Następnie rejestruje, które skrypty zostały uruchomione.
Nie jest to najpiękniejsze ani najbardziej złożone narzędzie, ale przy starannym zarządzaniu może działać bardzo dobrze. Jest open source i łatwo rozszerzalny. Gdy uruchamianie skryptów jest ładnie obsługiwane, można łatwo dodać kilka dodatkowych komponentów, takich jak skrypt powłoki, który sprawdza najnowsze skrypty i uruchamia program dbdeploy dla określonej instancji.
Zobacz dobre wprowadzenie tutaj:
http://code.google.com/p/dbdeploy/wiki/GettingStarted
źródło
Może się okazać, że Liquibase obsługuje wiele z tego, czego szukasz.
źródło
Każdy programista powinien mieć własną lokalną bazę danych i używać kontroli kodu źródłowego do publikowania w zespole. Moje rozwiązanie jest tutaj: http://dbsourcetools.codeplex.com/ Baw się dobrze, - Nathan
źródło