Vreau să-mi baze de date sub controlul versiunii. Are cineva vreun sfat sau articole recomandate pentru a obține început?
Am'll doresc întotdeauna să aibă cel puțin unele datele de acolo (ca alumb menționează: tipuri de utilizatori și administratori). Am'll, de asemenea, de multe ori doresc o colecție mare de generat date de testare pentru măsurători de performanță.
Martin Fowler a scris articolul meu preferat pe subiect, http://martinfowler.com/articles/evodb.html. Am ales să nu pun schema gropile de sub control versiune ca alumb și alții sugerează pentru că am vrut o modalitate ușoară de a face upgrade mea baze de date de producție.
Pentru o aplicație web în cazul în care nu'll au o producție unică instanță de bază de date, am utilizat două tehnici:
O secvență de date de upgrade script-uri care conțin DDL este necesar pentru a muta schema de la versiunea N la N+1. (Astea merg în versiunea dvs. de sistem de control.) Un _versionhistory masa, ceva de genul
create table VersionHistory (
Version int primary key,
UpgradeStart datetime not null,
UpgradeEnd datetime
);
devine o nouă intrare de fiecare dată când un upgrade script-ul ruleaza ceea ce corespunde la cea mai nouă versiune.
Acest lucru asigură că-l's ușor pentru a vedea ce versiune a schemei bazei de date există și că modernizarea bazei de date scripturile sunt rulate doar o singură dată. Din nou, acestea sunt nu baza de date gropile. Mai degrabă, fiecare script reprezintă modificări necesare pentru a trece de la o versiune la alta. Ei're scenariu care se aplică pentru dumneavoastră de baze de date de producție pentru a "upgrade" nu.
E un avertisment: Mea de teste automate rula cu o schema corecta, dar goale de date, astfel încât acest sfat nu se va potrivi perfect nevoilor tale._
Red Gate's SQL Compara produs nu numai vă permite să o faci la nivel de obiect comparații, și de a genera schimbare script-uri de la asta, dar, de asemenea, vă permite să exportați obiectele bazei de date într-un folder ierarhie organizată de tipul de obiect, cu un [objectname].sql crearea script-ul pe obiect în aceste directoare. Obiectul de tip ierarhie este ca aceasta:
\Funcțiile \De securitate \Securitate\Roluri \Securitate\Scheme \Securitate\Users \Procedurile Stocate \Mese
Dacă-ți arunci script-uri de la aceeași rădăcină director după ce efectuați modificări, puteți folosi acest lucru pentru a actualiza SVN repo, și să păstreze un istoric de funcționare de fiecare obiect individual.
Acesta este unul dintre "hard probleme" înconjurătoare dezvoltare. După câte știu, nu există soluții perfecte.
Dacă aveți nevoie doar pentru a stoca structura bazei de date și nu de date puteți exporta date ca interogări SQL. (în Enterprise Manager: dați clic Dreapta pe baza de date -> pentru a Genera script SQL. Recomand setarea "creați un fișier pentru fiecare obiect" pe fila opțiuni), puteți apoi comite aceste fișiere text la svn și să facă uz de svn's dif de logare.
Am legat-o împreună cu un Lot script care durează câteva parametri și stabilește baza de date. Am adăugat, de asemenea, unele întrebări suplimentare care să introduceți date implicit ca tipuri de utilizatori și utilizator admin. (Dacă doriți mai multe informații despre acest post de ceva si te pot pune scriptul pe undeva accesibil)
Dacă aveți nevoie pentru a păstra toate datele la fel de bine, nu recomandăm menținându-un back-up al bazei de date și utilizarea Redgate (http://www.red-gate.com/) produse pentru a face comparații. Ei nu't sunt ieftine, dar ele sunt în valoare de fiecare penny.
În primul rând, trebuie să alegeți versiunea de sistem de control, care este potrivit pentru tine:
Centralizat - sistem de Control al Versiunii - un sistem standard în cazul în care utilizatorii check out/check-in înainte/după ce vor lucra pe fișiere și fișierele sunt păstrate într-un singur server central
După configurarea unui depozit, iar în caz de o centrală sistem de control al versiunii un folder de lucru, puteți citi acest articol. Ea arată cum să setați sursa de control într-un mediu de dezvoltare, folosind:
SQL Server Management Studio prin intermediul MSSCCI furnizor,
Visual Studio și SQL Server data Tools
Un instrument 3rd party ApexSQL Sursă de Control
Aici, la Poarta Rosu oferim un instrument, SQL Sursă de Control, care utilizează SQL Compara tehnologia de la link-ul de baze de date cu un TFS sau SVN. Acest instrument se integrează în SSMS și vă permite să lucrați în mod normal, cu excepția faptului că acum vă permite să comită obiecte.
Pentru o migrații pe bază de abordare (mai potrivite pentru desfășurările automate), oferim SQL Schimbare de Automatizare (denumit anterior ReadyRoll), care creează și gestionează un set de script-uri incrementale ca un proiect Visual Studio.
În SQL Sursa de Comandă este posibil să se precizeze static tabele de date. Acestea sunt stocate în sursa de control ca INTRODUCE declarații.
Daca're vorbesc despre datele de testare, ne-am'd recomandăm să fie generarea de date de test cu un instrument sau printr-un post-implementare script-ai defini, sau pur și simplu a restabili o producție de rezervă la dev mediu.
+1 pentru toți cei care's a recomandat RedGate instrumente, cu o suplimentare de recomandare și un avertisment.
SqlCompare are, de asemenea, un decent documentate API: astfel încât să puteți, de exemplu, scrie o consolă aplicație care sincronizează sursă controlată script dosar cu un IC de testare de integrare de baze de date pe checkin, astfel încât atunci când cineva verifică într-o modificare a schemei de scripturile lor folder-l's automat desfășurate de-a lungul cu potrivire cererea de schimbare de cod. Acest lucru ajută decalajul cu care dezvoltatorii sunt uituc despre înmulțire modificări în db local până la o comună de dezvoltare DB (aproximativ jumătate dintre noi, cred :) ).
O problemă este că, cu un scenariu soluție sau în caz contrar, RedGate instrumente sunt suficient de buna care-l's ușor să uităm despre SQL realități subiacente abstractizare. Dacă redenumiți toate coloanele dintr-un tabel, SqlCompare nu are nici un fel de hartă veche coloane la noi coloane și va renunța la toate datele din tabel. Acesta va genera avertismente, dar am'am văzut oameni faceți clic trecut peste asta. Nu's un punct general aici în valoare de a face, cred, că poți automatiza DB versiunilor și upgrade de până acum - abstracții sunt foarte permeabil.
Vom folosi DBGhost pentru a gestiona baze de date SQL. Apoi ți-ai pus script-uri pentru a construi o nouă bază de date în versiunea ta de control, și-l'll, fie de a construi o nouă bază de date, sau upgrade la orice bază de date existentă pentru a schemei în versiunea de control. Că modul în care don't trebuie să vă faceți griji despre crearea schimba script-uri (deși puteți face, totuși, că, dacă, de exemplu, doriți să modificați tipul de date al unei coloane și au nevoie pentru a converti date).
Cu VS 2010, utilizați baza de Date a proiectului.
Face un perfect DB versiunilor soluție, și face sincronizarea DB's o briza.
Este o abordare bună pentru a salva baza de date script-uri în versiunea de control cu modificați script-uri, astfel încât puteți să faceți upgrade nici unul de date. De asemenea, ați putea dori pentru a salva scheme pentru diferite versiuni, astfel încât să puteți crea o bază de date completă fără a fi nevoie să se aplice tuturor schimba script-uri. Manipularea script-uri ar trebui să fie automatizate, astfel încât tu nu't au de a face muncă manuală.
Cred că este important să ai o bază de date separată pentru fiecare producător și nu utilizați o bază de date partajată. Că modul în care dezvoltatorii pot crea cazuri de testare și faze de dezvoltare în mod independent de alți dezvoltatori.
Automatizarea instrument ar trebui să aibă mijloace pentru manipularea bazei de date metadata, care spune ce baze de date sunt, în ce stare de dezvoltare și tabele, care conțin versiune controlabile de date și așa mai departe.
Ai putea, de asemenea, uita-te la un migrații soluție. Acestea vă permit să specificați schema de baze de date în C# cod, și rola versiunea bazei de date în sus și în jos folosind MSBuild.
Am'm în prezent, folosind DbUp, și-l's a fost de lucru bine.
Ai n't mai vorbim detalii despre mediul dumneavoastră țintă sau constrângeri, astfel încât aceasta nu poate fi în întregime aplicabile... dar daca're în căutarea pentru o modalitate de a urmări în mod eficient o evoluție schema DB și nu't adverse la ideea de a folosi Ruby, ActiveRecord's migrații sunt chiar dumneavoastră alee.
Migrații programatic defini baza de date transformări utilizând un Rubin DSL; fiecare transformare pot fi aplicate sau (de obicei) laminate înapoi, permițându-vă pentru a sări la o versiune diferită de schema DB la un moment dat în timp. Fișierul de definire aceste transformări pot fi verificate în versiunea de control ca orice altă piesă de cod sursă.
Pentru că migrațiile sunt o parte din ActiveRecord, au, de obicei, găsi utilizare în full-stack Șine aplicații; cu toate acestea, puteți utiliza ActiveRecord independent de Șine, cu un efort minim. A se vedea aici pentru o analiză mai detaliată tratamentul folosind AR's migrații în afara de Șine.
Fiecare bază de date ar trebui să fie sub sursa-cod de control. Ceea ce lipsește este un instrument automat de script toate obiectele bazei de date - și "datele de configurare" - pentru fișier, care apoi pot fi adăugate la orice sursa de sistemul de control. Dacă utilizați SQL Server, atunci soluția mea este aici : http://dbsourcetools.codeplex.com/ . Distreaza-te.
L's simplu.
Atunci când baza de proiect este gata, atunci trebuie să creați o bază de date completă script. Acest script se angajează să SVN. Aceasta este prima versiune.
După care toți dezvoltatorii creează schimba script-uri (ALTER..., tabele noi, sprocs, etc).
Atunci când ai nevoie de versiunea curentă, atunci ar trebui să execute toate noile schimba script-uri.
Atunci când app este eliberat de producție apoi du-te înapoi la 1 (dar atunci va fi succesive versiune de curs).
Nant va ajuta să-i execute pe cei modifica script-uri. :)
Și amintiți-vă. Totul funcționează bine atunci când nu există disciplină. De fiecare dată când baza de date schimbare este comis atunci funcțiile corespunzătoare în cod s-au angajat de asemenea.
Pentru a face dump la un cod sursă sistem de control care pic mai repede, puteți vedea ce obiecte s-au schimbat de la ultima dată de către folosind informațiile de versiune în sysobjects.
Configurare: Creați un tabel în fiecare bază de date în care doriți să verificați treptat să dețină informații despre versiunea de la ultima dată când ați verificat (gol la primul termen). Debifați această masă, dacă doriți să re-scana întreaga structură de date.
IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
name varchar(128),
id int, base_schema_ver int,
schema_ver int,
type char(2)
)
Normal de funcționare: puteți lua rezultatele de la această sql, și de a genera script-uri sql pentru doar cele pe care le're interesat în, și le-a pus într-o sursă de control de alegerea ta.
IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
name varchar(128),
id int, base_schema_ver int,
schema_ver int,
type char(2)
)
SET NOCOUNT ON
-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions
DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects
-- This next bit lists all differences to scripts.
SET NOCOUNT OFF
--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION
--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/,
'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE (
o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver <> t.schema_ver
)
AND o.type IN ('TR', 'P' ,'U' ,'V')
AND o.name NOT IN ( SELECT oi.name
FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
WHERE oi.name <> ti.name /*COLLATE*/
AND oi.type IN ('TR', 'P' ,'U' ,'V'))
UNION
--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
WHERE NOT EXISTS (SELECT * FROM sysobjects oi
WHERE oi.id = ti.id))
AND t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
WHERE NOT EXISTS (SELECT * FROM #tmp ti
WHERE oi.id = ti.id)
AND oi.type IN ('TR', 'P' ,'U' ,'V'))
UNION
--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
WHERE o.id = t.id)
AND t.name NOT IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
WHERE NOT EXISTS (SELECT * FROM #tmp ti
WHERE oi.id = ti.id)
AND oi.type IN ('TR', 'P' ,'U' ,'V'))
UNION
--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
WHERE o.id = t.id)
AND o.type IN ('TR', 'P' ,'U' ,'V')
AND o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
WHERE NOT EXISTS (SELECT * FROM sysobjects oi
WHERE oi.id = ti.id))
ORDER BY Priority ASC
Notă: Dacă utilizați un non-standard de asamblare în orice baze de date, va trebui să înlocuiți /* ASAMBLARE */
cu baza dumneavoastră de date de colaționare. de exemplu, ASAMBLARE Latin1_General_CI_AI
Dacă aveți o mică bază de date și doriți să-versiune de lucru întreg, acest lot script ar putea ajuta. Se detașează, comprese, și controale de o bază de date MSSQL MDF fișier în Subversiune.
Dacă cea mai mare parte doresc la versiunea ta de schemă și o cantitate mică de date de referință, puteți folosi, eventual, SubSonic Migrații să se ocupe de asta. Avantajul este că puteți migra cu ușurință în sus sau în jos la orice versiune specifică.
Pentru că aplicația noastră are de a lucra pe mai multe RDBMSs, ne-am păstrat schema definition în versiunea de control folosind baza de date-neutru Cuplu format (XML). Avem, de asemenea, versiunea-controlul datelor de referință pentru baza noastră de date în format XML după cum urmează (în cazul în care "Relația" este una din tabelele de referință):
<Relationship RelationshipID="1" InternalName="Manager"/>
<Relationship RelationshipID="2" InternalName="Delegate"/>
etc.
Apoi folosim acasă-cultivate instrumente pentru a genera schema upgrade-ul și datele de referință upgrade script-uri care sunt necesare pentru a trece de la versiunea X din baza de date de la versiunea X + 1.
Am scris această aplicație un timp în urmă, http://sqlschemasourcectrl.codeplex.com/ care va scana MSFT SQL db's ori de câte ori doriți și în mod automat a arunca obiecte (tabele, vizualizări, proc, funcții sql setări) în SVN. Funcționează ca un farmec. Eu il folosesc cu Unfuddle (care-mi permite să obțineți alerte cu privire la checkins)
Am avut nevoie de la versiunea noastră de date SQL după ce am migrat de la un x64 platforma și versiunea veche a rupt cu migrația. Am scris un C# cerere care a folosit SQLDMO pentru a mapa toate SQL obiecte într-un folder:
Root ServerName DatabaseName Schema Obiecte Baza De Date Declanșează*Aplicația va compara apoi a scris recent versiune la versiune stocate în SVN și dacă există diferențe ar actualizare SVN. Am stabilit că rulează procesul o dată o noapte a fost suficientă, deoarece nu facem asta de multe schimbări la SQL. Ea ne permite să urmăriți modificările de la toate obiectele de care ne pasă, plus că ne permite să reconstruim complet schema în caz de o problemă serioasă..ddltrigger.sql Funcții . .funcția.sql De securitate Roluri Cerere Roluri .approle.sql Baza De Date Pe Roluri .rol.sql Scheme* .schema.sql Utilizatorii .utilizator.sql Depozitare Textul Complet Cataloage* .fulltext.sql Proceduri Stocate . .proc.sql Sinonime* .sinonim.sql Mese . .masă.sql Constrângeri . . .chkconst.sql . . .defconst.sql Indici . . .index.sql Cheile . . .fkey.sql . . .pkey.sql . . .tasta u.sql Declanseaza . . .trăgaci.sql Tipuri Definite de utilizator Tipuri de Date . .uddt.sql XML Schema Colecții* . .xmlschema.sql Opinii . .vedere.sql Indici . . .index.sql Declanseaza . . .trăgaci.sql
Am don't magazin schema bazei de date, vom păstra modificări la baza de date. Ceea ce facem noi este magazin schema modificări, astfel încât să ne construim o schimbare script pentru orice versiune a bazei de date și se aplică pentru clientul nostru's de date. Am scris un utilitar de baze de date app, care este distribuit cu principalul nostru aplicație care poate citi scenariul și știu ce actualizări trebuie să fie aplicate. Ea are, de asemenea, suficient de inteligenta pentru a reîmprospăta vizualizări și proceduri stocate după cum este necesar.