2009-10-07 18 views
9

Przeczytałem wiele postów na temat znaczenia kontroli wersji bazy danych. Jednak nie mogłem znaleźć prostego rozwiązania, jak sprawdzić, czy baza danych jest w stanie, że tak powinno być.Sprawdzanie zmian w bazie danych (kontrola wersji)

Na przykład mam bazy danych z tabelą o nazwie "Wersja" (tam zapisywany jest numer wersji). Dostęp do bazy danych jest jednak możliwy i edytowany przez programistów bez zmiany numeru wersji. Jeśli na przykład programista aktualizuje procedurę przechowywaną i nie aktualizuje stanu bazy danych wersji, nie jest zsynchronizowany z wartością wersji.

Jak śledzić te zmiany? Nie muszę śledzić, co się zmieniło, ale trzeba tylko sprawdzić, czy tabele, widoki, procedury itp. Bazy danych są zsynchronizowane z wersją bazy danych zapisaną w tabeli wersji.

Dlaczego tego potrzebuję? Podczas wdrażania muszę sprawdzić, czy baza danych jest "poprawna". Ponadto nie należy śledzić wszystkich tabel ani innych obiektów bazy danych. Czy można sprawdzić bez użycia wyzwalaczy? Czy można to zrobić bez narzędzi zewnętrznych? Czy bazy danych mają sumy kontrolne?

Powiedzmy, że używamy SQL Server 2005.

edycja:

Chyba powinienem dostarczyć nieco więcej informacji na temat naszego obecnego środowiska - mamy „bazową” ze wszystkich skryptów potrzebnych do stworzenia bazy wersja (zawiera obiekty danych i "metadane" dla naszej aplikacji). Istnieje jednak wiele instalacji tej "podstawowej" wersji z dodatkowymi obiektami bazy danych (dodatkowe tabele, widoki, procedury itp.). Kiedy wprowadzimy jakąś zmianę w wersji "podstawowej", musimy również zaktualizować niektóre instalacje (nie wszystkie) - w tym czasie musimy sprawdzić, czy "baza" jest w poprawnym stanie.

Dzięki

Odpowiedz

1

Używam prostego pliku VBScript w oparciu o this codeproject article do generowania kropli/tworzenie skryptów dla wszystkich obiektów bazy danych. Następnie umieszczam te skrypty pod kontrolą wersji.

Tak, aby sprawdzić, czy baza danych jest up-to-date lub ma zmian, które nie zostały jeszcze wprowadzone do kontroli wersji, mogę to zrobić:

  • uzyskać najnowszą wersję spadku/tworzenie skryptów z wersji kontrola (przewrót w naszym przypadku)
  • wykonać skrypt SqlExtract do bazy danych należy sprawdzić, zastępując skrypty z kontrolą wersji
  • teraz mogę skontaktować się z moim klientem subversion (TortoiseSVN) które pliki nie są zgodne z wersją pod kontrolą wersji
  • n lub zaktualizuj bazę danych lub zmodyfikuj skrypty pod kontrolą wersji
5

Używamy DBGhost do kontroli wersji bazy danych. Skrypty do tworzenia bieżącej bazy danych są przechowywane w TFS (wraz z kodem źródłowym), a następnie DBGhost służy do generowania skryptu delta w celu uaktualnienia środowiska do bieżącej wersji. DBGhost może również tworzyć skrypty delta dla wszelkich danych statycznych/referencyjnych/kodowych.

Wymaga to zmiany umysłu metodą tradycyjną, ale jest fantastycznym rozwiązaniem, którego nie mogę wystarczająco polecić. Chociaż jest to produkt innej firmy, idealnie pasuje do naszego automatycznego procesu budowania i wdrażania.

+0

Używam DbGhost przez 10 lat i nigdy mnie nie zawiodą. Wsparcie, które zapewniają, nie ma sobie równych. – penderi

0

Pierwsza kwestia: trudno jest utrzymać porządek bez "przepisów". Lub na Twój przykład - programiści zmieniający cokolwiek bez powiadomienia doprowadzą Cię do poważnych problemów.

W każdym razie - mówisz "bez użycia wyzwalaczy". Jakiś konkretny powód tego?

Jeśli nie - sprawdź wyzwalacze DDL. Takie wyzwalacze są najłatwiejszym sposobem sprawdzenia, czy coś się stało.

Można nawet rejestrować, CO DZIAŁA.

0

Mam nadzieję, że ktoś ma lepsze rozwiązanie niż to, ale mogę to zrobić przy użyciu metody para:

  • mieć „tułowia” bazę danych, która jest obecna wersja rozwojowa. Cała praca jest wykonywana tutaj, ponieważ jest przygotowywana do włączenia do wydania.
  • Za każdym razem uwolnienie odbywa się:
    • „czysty” w bazie ostatniego wydania jest kopiowane do nowego, na przykład, „DB_1.0.4_clean”
    • SQL-Compare służy do kopiowania zmiany od tułowia do 1.0.4_clean - to również pozwala dokładnie sprawdzić, co jest dołączone.
    • Porównanie SQL jest używane ponownie, aby znaleźć różnice między poprzednimi i nowymi wersjami (zmiany z DB_1.0.4_clean do DB_1.0.3_clean), które tworzą skrypt zmian "1.0.3 do 1.0.4.sql".

Ciągle budowania narzędzie do automatyzacji tej części, ale głównym celem jest to, że znajduje się stół do śledzenia każdej wersji Baza danych została w, i jeśli skrypt zmiana została zastosowana. Narzędzie do aktualizacji wyszuka najnowszy wpis, a następnie zastosuje każdy skrypt aktualizacji jeden po drugim, a na końcu DB będzie miał najnowszą wersję.

Nie mam tego problemu, ale byłoby banalnie chronić bazy danych _clean przed modyfikacją przez innych członków zespołu. Dodatkowo, ponieważ używam SQL Compare po wygenerowaniu skryptów zmian, deweloperzy nie muszą ich śledzić.

  • Rzeczywiście zrobiliśmy to przez jakiś czas i był to OGROMNY ból. Łatwo było zapomnieć, a jednocześnie dokonywano zmian, które niekoniecznie musiały być wykonane - więc pełny skrypt aktualizacyjny utworzony przy użyciu indywidualnie tworzonych skryptów zmian czasami dodawał pole, a następnie usuwał je, wszystkie w jedno wydanie. To oczywiście może być dość bolesne, jeśli nastąpią zmiany w indeksie, itp.

Dobrą rzeczą w porównaniu z SQL jest skrypt, który generuje w transakcji - a jeśli się nie powiedzie, wszystko zwróci. Jeśli więc produkcja bazy danych została zmodyfikowana w jakiś sposób, uaktualnienie się nie powiedzie, a następnie zespół wdrożeniowy może faktycznie użyć porównania SQL na bazie produkcyjnej z bazą danych _clean db i ręcznie naprawić zmiany. Musieliśmy zrobić to tylko raz lub dwa razy (cholerni klienci).

Skrypty zmiany .SQL (generowane przez porównanie SQL) są zapisywane w naszym systemie kontroli wersji (subversion).

1

Musisz ograniczyć dostęp do wszystkich baz danych i zapewniać programistom dostęp do lokalnej bazy danych (tam, gdzie one się rozwijają) i do serwera deweloperskiego, gdzie mogą wykonywać integrację. Najlepiej byłoby, gdyby mieli oni lokalnie dostęp do lokalnego środowiska programistycznego i wykonywali zadania integracyjne za pomocą zautomatyzowanej kompilacji. Możesz użyć narzędzi takich jak redgates sql porównać, aby zrobić różnice w bazach danych.Sugeruję, aby zachować wszystkie zmiany pod kontrolą kodu źródłowego (pliki .sql), dzięki czemu będziesz mieć historię, kto zrobił co, kiedy i jak możesz w razie potrzeby przywrócić zmiany db.

Chciałbym również mieć możliwość uruchomienia przez programistów lokalnego skryptu kompilacji, aby ponownie zainicjować lokalną skrzynkę dev. W ten sposób zawsze mogą się wycofać. Co ważniejsze, mogą tworzyć testy integracyjne, które testują instalacje aplikacji (repozytorium i dostęp do danych) i logikę ukrytą w przechowywanej procedurze w sposób zautomatyzowany. Zainicjowana jest inicjalizacja (resetowanie bazy danych), testy integracyjne są uruchamiane (tworzenie fluff w db), reinicjalizacja, aby przywrócić db do stanu czyszczenia, itp.

Jeśli jesteś użytkownikiem SVN/Nant Style (lub podobnym) z Koncepcja pojedynczego oddziału w twoim repozytorium, możesz przeczytać moje artykuły na ten temat w DotNetSlackers: http://dotnetslackers.com/articles/aspnet/Building-a-StackOverflow-inspired-Knowledge-Exchange-Build-automation-with-NAnt.aspx i http://dotnetslackers.com/articles/aspnet/Building-a-StackOverflow-inspired-Knowledge-Exchange-Continuous-integration-with-CruiseControl-NET.aspx.

Jeśli jesteś wielorodzajowym rodzajem build master, musisz poczekać, aż napiszę coś o tym rodzaju automatyzacji i zarządzania konfiguracją.

UPDATE

@Sazug: „Tak, możemy użyć jakiegoś wielu gałęzi buduje gdy używamy scenariusz bazowy + dodatkowe skrypty :) jakichkolwiek podstawowych wskazówek dotyczących tego rodzaju automatyzacji bez pełnego artykułu” Są to najczęściej dwa rodzaje baz danych:

  • kontrolować db w nowym środowisku typu non-produkcyjna (tylko aktywne dev)
  • środowisko produkcyjne gdzie masz dane żywo gromadzeniu się jak rozwijać

Pierwsza konfiguracja jest o wiele łatwiejsza i może być w pełni zautomatyzowana, od dev do prod i do ewentualnego wycofania wtyczki. Do tego potrzebny jest po prostu folder skryptów, w którym każda modyfikacja bazy danych może być przechowywana w pliku .sql. Nie sugeruję, że zachowujesz plik tablename.sql, a następnie wersję taką, jak plik .cs, w którym aktualizacje tego artefaktu sql są z czasem modyfikowane w tym samym pliku. Biorąc pod uwagę, że obiekty sql są tak mocno zależne od siebie nawzajem. Gdy tworzysz bazę danych od podstaw, twoje skrypty mogą napotkać przełomową zmianę. Z tego powodu sugeruję, aby zachować oddzielny i nowy plik dla każdej modyfikacji z numerem kolejnym na początku nazwy pliku. Na przykład coś w rodzaju 000024-ModifiedAccountsTable.sql. Następnie możesz użyć zadania niestandardowego lub czegoś z NAntContrib lub bezpośredniego wykonania jednego z wielu narzędzi wiersza poleceń SQL.EXE, aby uruchomić wszystkie skrypty przeciwko pustej bazie danych od 000001-fileName.sql do ostatniego pliku w folderze updateScripts. Wszystkie te skrypty są następnie rejestrowane do kontroli wersji. A ponieważ zawsze zaczynasz od czystego db, zawsze możesz wycofać, jeśli ktoś inny niszczy kompilację.

W drugiej automatyzacji środowiska nie zawsze jest najlepszą drogą, ponieważ może wpłynąć na produkcję. Jeśli aktywnie pracujesz przeciwko/dla środowiska produkcyjnego, naprawdę potrzebujesz wielobranżowego/środowiska, abyś mógł przetestować swój sposób automatyzacji zanim zaczniesz naciskać na środowisko prod. Możesz użyć tych samych pojęć, które podano powyżej. Jednak nie można tak naprawdę zacząć od zera na prod dB i wycofywanie jest trudniejsze. Z tego powodu sugeruję użycie RedGate SQL Porównaj podobne w twoim procesie kompilacji. Skrypty .sql są sprawdzane w celu aktualizacji, ale trzeba zautomatyzować różnice między bazą danych i bazą danych prod db przed uruchomieniem aktualizacji. Następnie możesz próbować zsynchronizować zmiany i wycofać prod, jeśli wystąpią problemy. Przed automatycznym wprowadzaniem zmian sql należy wykonać kopię zapasową. Zachowaj ostrożność, wykonując cokolwiek bez czujnego ludzkiego oka podczas produkcji! Jeśli wykonasz prawdziwą, ciągłą integrację we wszystkich środowiskach dev/qual/stage/performance, a następnie wykonasz kilka ręcznych czynności, gdy będziesz naciskać na produkcję ... to naprawdę nie jest takie złe!

+0

+1 w celu ograniczenia dostępu. to jest klucz do rozwiązania problemu. wszystko inne to tylko szczegóły. – rmeador

+0

Tak, używamy jakiegoś rodzaju kompilacji wielu gałęzi, gdy używamy skryptu podstawowego + dodatkowych skryptów :) Jakieś podstawowe wskazówki dotyczące tego rodzaju automatyzacji bez pełnego artykułu? – Sazug

0

Jeśli masz program Visual Studio (konkretnie wydanie bazy danych), możesz utworzyć plik Database Project i wskazać go na bazę danych SQL Server. Projekt załaduje schemat i zasadniczo zaoferuje wiele innych funkcji. Zachowuje się jak projekt kodu. Zapewnia to także zaletę skryptowania całego zbioru i zawartości, dzięki czemu można go zachować w Subversion. Podczas budowania projektu sprawdza poprawność bazy danych. Jest całkiem sprytny.

0

W jednym z naszych projektów przechowywaliśmy wersję bazy danych w bazie danych.

Każda zmiana struktury bazy danych została zapisana w oddzielnym pliku sql, który zwiększył wersję bazy danych oprócz wszystkich innych zmian. Zrobił to programista, który zmienił strukturę db.

Skrypt wdrażania został sprawdzony pod kątem aktualnej wersji bazy danych i najnowszego skryptu zmian i zastosował te skrypty sql, jeśli to konieczne.

5

Wygląda na to, że łamiesz pierwszą i drugą regułę "Three rules for database work". Używanie jednej bazy danych na jednego programistę i jednego autorytatywnego źródła dla twojego schematu już by bardzo pomogło. Wtedy nie jestem pewien, czy masz Baseline dla swojej bazy danych, a co ważniejsze, że używasz change scripts. Na koniec możesz znaleźć inne odpowiedzi w Views, Stored Procedures and the Like i Branching and Merging.

W rzeczywistości wszystkie te linki są wymienione w tym wspaniałym artykule Jeffa Atwooda: Get Your Database Under Version Control. Musi przeczytać IMHO.

+0

Hej, nikt nie jest doskonały! Próbujemy zmienić nasz proces rozwoju, ale nie da się tego zrobić w jeden dzień. Czasami trzeba to robić małymi krokami. – Sazug

+0

Przepraszam, Sazuku, chciałem tylko dostarczyć użytecznych zasobów i naprawdę nie chciałem być niegrzeczny. –

+0

+1 za podanie linku do ["Trzy zasady dotyczące pracy z bazami danych"] (http://odetocode.com/blogs/scott/archive/2008/01/30/three-rules-for-database-work.aspx) . –

0

Po pierwsze, twoja produkcyjna baza danych nie powinna być dostępna dla programistów lub programiści (i wszyscy inni) powinni być pod ścisłym nadzorem, że żadne zmiany nie są wprowadzane do systemów produkcyjnych poza systemem kontroli zmian.

Kontrola zmian jest niezbędna w każdym systemie, w którym pracujesz (gdzie> 1 inżynier jest zaangażowany w cały system).

Każdy programista powinien mieć własny system testowy; jeśli chcą wprowadzić zmiany w tym zakresie, mogą, ale system powinien zostać przeprowadzony na bardziej kontrolowanym systemie testowym, który ma takie same zmiany jak produkcja - jeśli tego nie zrobisz, nie możesz polegać na wydaniach działa, ponieważ są testowane w niezgodnym środowisku.

Po wprowadzeniu zmiany, odpowiednie skrypty powinny być tworzone i testowane w celu zapewnienia, że ​​odnoszą się one równo na szczycie aktualnej wersji, i że wycofywania działa *

* piszesz skrypty wycofania, prawda?

+0

Przechodzimy do procesu, w którym programiści nie mogli uzyskać dostępu do produkcyjnej bazy danych, ale trudno jest pokazać korzyści rozwijające się w wersji testowej, a następnie aktualizację wersji na żywo, gdy nie można tego zrobić automatycznie. Oczywiście rozwijanie w wersji na żywo jest o wiele łatwiejsze, ale nie bezpieczne. Skrypty przywracania działają tylko w przypadku zmian schematu, a nie zmian w "metadanych"? Nie, nie ma jeszcze skryptów wycofywania ... – Sazug

+0

Skrypty przywracania powinny działać przy każdej zmianie. Jeśli chcesz spakować skrypt wycofania jako skrypt powłoki lub mały program, zrób to. Najłatwiej jest, próbując uczynić zmiany w schemacie bazy danych "kompatybilnymi wstecznie", aby można było zaktualizować bazę danych, pozostawiając stare serwery aplikacji w miejscu, a następnie je uaktualnić. W przeciwnym razie pojawi się wieloetapowe wdrożenie i wiele trudnych testów. – MarkR

0

Zgadzam się z innymi wpisami, że deweloperzy nie powinni mieć uprawnień do zmiany produkcyjnej bazy danych. Deweloperzy powinni dzielić się wspólną bazą danych programistycznych (i ryzykować deptaniem sobie nawzajem palców) lub powinni mieć własne, indywidualne bazy danych. W pierwszym przypadku możesz użyć narzędzia takiego jak SQL Compare, aby wdrożyć do produkcji. W tym drugim przypadku musisz okresowo zsynchronizować bazy danych deweloperów podczas cyklu życia oprogramowania, zanim zostaniesz przeniesiony do produkcji.

W Red Gate wkrótce zamierzamy wypuścić nowe narzędzie, SQL Source Control, mające na celu ułatwienie tego procesu. Zintegrujemy się z SSMS i umożliwi dodawanie i pobieranie obiektów do iz kontroli źródła za jednym kliknięciem.Jeśli jesteś zainteresowany dowiedzieć się więcej lub logując się do naszego Programu dostępu wcześnie, odwiedź tę stronę:

http://www.red-gate.com/Products/SQL_Source_Control/index.htm

+0

Po prostu aktualizacja: SQL Source Control 1.0 został wydany. Łączy to twój DB dewelopera z SVN lub TFS. http://www.red-gate.com/products/SQL_Source_Control/index.htm –

0

muszę zgodzić się z resztą postu. Ograniczenia dostępu do baz danych rozwiązałyby problem związany z produkcją. Następnie za pomocą narzędzia do wersjonowania, takiego jak DBGhost lub DVC, pomożemy Tobie i reszcie zespołu w utrzymaniu wersji bazy danych