Top Banner
Versiebeheer van database changes | 19 april 2012 Versiebeheer van database changes “Database Changes done Right” – thedailywtf.com Arjen van Vliet DICTU AB Team 3
29

Versiebeheer van database changes

Jul 08, 2015

Download

Technology

Arjen van Vliet

Version control of database changes (in Dutch).
based on article 'Database Changes done Right' on www.thedailywtf.com
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012

Versiebeheer van database changes“Database Changes done Right” – thedailywtf.com

Arjen van VlietDICTU AB Team 3

Page 2: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering2

Inleiding• Kijk uit wat je shared op LinkedIn, voordat je ‘t weet mag je er een

presentatie over geven ;-)• Presentatie is deels gebaseerd op artikel “Database changes done

right”, verschenen op 28-02-2012 op www.thedailywtf.com

Page 3: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering3

Software configuration management (SCM)• Revision control• a.k.a. version control• a.k.a. source control

Page 4: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering4

Definitie Versiebeheersysteem• Een computerprogramma of een verzameling programma's

waarmee men de wijzigingen in documenten, programma's of andere informatie bewaard in computerbestanden kan beheren.

• Het meest gebruikt bij de ontwikkeling van software.• Meerdere mensen kunnen wijzigingen aanbrengen aan dezelfde

bestanden.• Wijzigingen worden meestal aangeduid met een code, het

"revisienummer" of "revisieniveau.• Elke wijziging wordt gekoppeld aan een timestamp en aan de

persoon die de wijziging maakte.• Wijzigingen kunnen vergeleken worden, hersteld en soms

samengevoegd.

Page 5: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering5

Bekende tools• Local

• Free/open-source: SCCS (1972), RCS (1982)• Properietary: PVCS (1985)

• Client/Server (‘Centralized’)• Free/open-source: CVS (1990), CVSNT (1998), Subversion(2000)• Proprietary: Software Change Manager (1970s), ClearCase (1992), CMVC

(1994), Visual Source Safe (1994), Perforce (1995), StarTeam (1995), MKS Integrity (2001), AccuRev SCM (2002), SourceAnywhere (2003), SourceGearVault (2003), Team Foundation Server (2005), Rational Team Concert (2008)

• Distributed• Free/open-source: GNU arch (2001), Darcs (2002), DVCS (2002), SVK

(2003), Monotone (2003), Codeville (2005), Git (2005), Mercurial(2005), Bazaar(2005), Fossil(2007), Veracity(2011)

• Proprietary: Teamware (1990s), Code Co-op (1997), Bitkeeper (1998), Plastic SCM (2006)

Page 6: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering6

Verschil tussen client/server en distributed• Client/Server (plaatje):

• Centrale repository• “Locken d.m.v. Check-In /

Check Out”

• Distributed:• Iedere ontwikkelaar heeft een

eigen ‘working copy’ repository.

• Programmacode wordt ge-merged.

• “Possibly the biggest advance in software development technology in the past ten years." [Joel Spolsky]

Page 7: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering7

Maar nu databases…• Databases zijn anders t.o.v. applicatiecode :

• Applicatiecode ‘does stuff’• Applicatiecode ‘leeft’ in source control• Applicatiecode wordt ge(systeem)test, gepromoveerd,

ge(acceptatie)test, gepromoveerd, etc.• Applicatiecode verandert niet na deployment; als er bug

gevonden wordt, begint het proces van voren af aan.

• Databases ‘leven’ op een database server.• Er kunnen andere instances zijn (ontw, test, accp), maar de

produktie database is de belangrijkste.• Databases ‘don’t do stuff’, maar ondergaan queries en updates• Databases veranderen wel na deployment, dat is de reden dat

ze uberhaupt bestaan.

Page 8: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering8

‘Database changes done wrong’• Je kunt niet even een set bestanden in een directory neerzetten en

roepen dat de nieuwe database versie uitgerold is…• Idem voor terugrollen…

• Database changes kunnen alleen d.m.v. SQL script• Terugrollen door ‘spiegel/undo’ script, maar beter nog door restore

van backup

Dit gaat tegen de natuur in van de gemiddelde developer vanwege:• Weerstand tegen verandering• Ongecontroleerde verandering

Wat dan weer tot ongewenste anti-patterns leidt….

Page 9: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering9

Slecht voorbeeld: ‘Entity-Attribute-Value design’• Eén van de ergste database design anti-patterns die er bestaat• Onder het mom van ‘lekker flexibel’• Mooi voorbeeld van ‘inner platform effect’ *

Page 10: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering10

‘Inner platform effect’• De neiging van software architecten om een systeem zo

aanpasbaar/flexibel te maken, dat het een slechte replica van het gebruikte ontwikkelplatform wordt.

Page 11: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering11

Taxonomie (indeling) van database scripts• Query scripts

Geen impact op data of database structuur, zoals eenvoudige SELECT statements.

• Object scriptsVeranderen de database, maar alleen door toevoegen/wijzigen/verwijderen van niet-data objecten zoals stored procedures, views, functies etc.

• Change scriptsVeranderen de structuur van de opgeslagen data in tabellen (ALTER TABLE, INSERT, CREATE INDEX etc.)

Alleen Object scripts en Change scripts vallen onder database changes.

Page 12: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering12

‘Object Script Changes Done Right’• Veel applicaties maken gebruik van objecten in de database:

• Stored procedures• Views• Triggers

• Deze objecten zijn gewoon programmacode en moeten dus ook als zodanig behandeld worden:

• ‘leven’ in source control• Gelabeld bij een build• Deployed (uitgeleverd) tegelijk met de programmacode.• etc.

Page 13: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering13

Een goed object script…• Moet drie dingen doen:

Page 14: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering14

Naar Source Control…• Object scripts…

• creëren slechts objecten

• kunnen herhaald worden zonder consequenties

Eénmaal aangemaakt op disk, dan naar Source Control…

Let ook op de cijfer-prefix in de bestandsnaam…

Page 15: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering15

Uitvoeringsvolgorde• Deze cijfer-prefixes zorgen voor de juiste uitvoeringsvolgorde.• Eventueel kan je een eenvoudig batch script maken dat de

bestanden in de goede volgorde uitvoert:FOR /R . %%f IN (*.sql) DO (

OSQL -E -i "%%f" -n -b -d MyDataBase

)

Met deze technieken volg je voor je object change scripts precies dezelfde werkwijze als met je applicatiecode.

Page 16: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering16

‘Database Change Scripts Done Right’Wat database change scripts zo moeilijk maakt:• Veranderingen komen van twee kanten tegelijk:

1. Data changes (INSERT, UPDATE, DELETE) direct in produktie database2. Data structure changes (ALTER TABLE etc.) doorlopen staging (dev-

>test->prod) en testing.

Shortcuts leiden tot anti-patterns…

Page 17: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering17

Twee belangrijke regels bij database change scripts

1. Draai het script één keer en niet vaker.Je kunt maar één keer een kolom aan een tabel toevoegen…

2. Het is onmogelijk om het script te ‘undo-en’Zodra je een kolom gedropt hebt, is-ie echt voorgoed weg…

Page 18: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering18

Anti-pattern: Re-executable Change Scripts

Page 19: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering19

• Het IF block test of het script al eens gedraaid is.• Lijkt leuk, maar leidt tot anti-patterns en uncontrolable change• B.V. de vorige versie van Sprocket_Name was VARCHAR(50) NULL

en was al goedgekeurd na acceptatietest.

Page 20: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering20

Anti-pattern: Database Syncing• Er zijn veel ‘database-diff’ tools voorhanden• Sommigen maken zelfs change scripts aan om databases te syncen

Net als re-executable change scripts veroorzaken deze tools :• ‘kortsluiting’ in de volgordelijkheid van het change proces• ongecontroleerde veranderingen.

Grootste bezwaar:Door gebruik van deze tools wordt het testproces tussen de verschillende fasen

gepasseerd.

Page 21: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering21

Following the Cardinal Rules1. Ontwikkel change script2. (Code review)3. Draai script in test omgeving4. Draai script in productie omgeving

Bij fout: herstel database en ga naar stap 1.

Page 22: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering22

‘Tools of the Trade’Deze hulpmiddelen kan je gebruiken:• Change Script Library• Execution Logs• Database Versioning

Page 23: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering23

Change Script LibraryAl je change scripts zouden in library moeten staan, met deze aandachtspunten:• Write–Once

Change scripts veranderen niet gedurende life cycle, net als de applicatiecode zelf.

• MetadataRegistreer:• Uniek ID• Auteur• Applicatie• Release nummer

• Geautoriseerde toegang en loggingAlleen geautoriseerde ontwikkelaars mogen change scrips

draaien

Page 24: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering24

Execution LogsRegistratie van welk script wanneer gedraaid is, buiten de database.

Registreer minimaal:• Uniek ID van script• Wie het script gedraaid heeft• Wanneer het script gedraaid is• Tegen welke database het gedraaid heeft• Status na het draaien• Output log van het script

Page 25: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering25

Database VersioningRegistratie van welk script wanneer gedraaid is, binnen de database; ‘metadata’ tabel.

Kan zo simpel zijn als een tabel met twee kolommen:1. Uniek ID2. Datum gedraaid

• Voordat je een script draait, eerst deze tabel checken of het al gedraaid is.

• Na het draaien deze ‘metadata’ tabel bijwerken. Dit valt te automatiseren!

Makkelijk hulpmiddel om een pre-productie database te restoren:• Backup terug (laten) zetten.• Alle scripts uit de ‘metadata’ tabel draaien.

Page 26: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering26

Voorbeeld van een metadata tabel

Page 27: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering27

‘Wrapping Things Up’ -> Conclusie• Databases zijn het middelpunt van je applicatie.

• Applicatiedata overleeft vaak de applicatie zelf.

• Als je bang bent om database veranderingen aan te brengen, of juist te onvoorzichtig, laat je een ‘legacy’ (erfenis) achter die niemand na jou wil/kan onderhouden.

Page 28: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering28

Vragen?

Discussie?

Page 29: Versiebeheer van database changes

Versiebeheer van database changes | 19 april 2012Dienst ICT Uitvoering29

Dank voor jullie aandacht !