Käytännöllinen työkalu tietokannan versionhallintaan

Timo Myllymäki
Timo Myllymäki
5.3.2019

Versionhallinta on koitunut yllättävän hankalaksi tietovaraston ylläpidossa. Tälle on useita syitä. Yksi suurimpia syitä mielestäni on se, että SSMS (SQL Server Management Studio) ei tue suoraan versionhallintaa. Tähän kyllä löytyy maksullisia kolmannen osapuolen työkaluja. Toisena vaihtoehtona on tietokantaprojektit. Tämä kuitenkin määrää sen, että kaikki muutokset tulee tehdä tietokantaprojektin kautta, jolloin ne päätyvät versionhallintaan. Synkronoinnin voi myös tehdä jälkeenpäin, mutta tällöin ei ole varmuutta, että kaikki välivaiheet muutoksissa säilyisivät.

Tämän pohjalta heräsi idea. Miksi pakosti muuttaa tapojaan, kun suurin tarve versionhallinnalle piilee kuitenkin historian ja muutosten säilymisessä, jos unohdetaan branchit ja muut hienoudet. Eikö muutoksia saisi talteen ilman, että käyttäjän tarvitsee tehdä mitään? Tästä syntyi idea ja sen pohjalta kehittelin pienen työkalun:

Mitä giffissä tapahtui:

  1. Tein muutoksen proseduuriin ajamalla ALTER-lauseen
  2. Scripti poimi muutokset automaattisesti
  3. Muutokset vietiin Azure DevOps (VSTS) versionhallintaan

Mitä pinnan alla tapahtui:

  1. ALTER lause käynnisti tietokantatriggerin, joka poimi muutokset logi-tauluun
  2. Sovellus pollasi logi-taulua ja löysi uuden rivin
  3. Sovellus haki kannasta objectille CREATE lauseen ja tallensi sen levylle .sql -tiedostoon, git repositoryyn
  4. Muutoksille tehtiin commit ja pushattiin remoteen (VSTS)
  5. Logi-taulusta tyhjättiin edelliset muutokset

Hyvin yksinkertainen konsepti, joka ei rasita liialti kantaa. Suurin kuorma tuleekin scriptien generoinnissa ja levylle kirjoittamisessa, mutta sovelluksen voikin laittaa pyörimään, mille tahansa koneelle, jolta on pääsy kantaan. Tyhjän taulun pollaus ei juurikaan rasita kantaa ja pollauksen voi tehdä itselleen sopivalla intervallilla. Kaikki muutokset löytyvät kuitenkin taulusta, jolloinka ei ole väliä kuinka nopealla syklillä muutoksia poimitaan versionhallintaan. Pollaus ei toki ole tässä tapauksessa paras vaihtoehto, mutta esimerkiksi Service Brokerin käyttöönotto vaatisi muutoksia nykyisiin kantainstansseihin, mikä ei ole tämän projektin tavoite.

Tarkkasilmäisimmät varmaan huomasivat, että muutoksella ei ollut järkevää kommenttia. Kommentit toki ei ole mahdollisia, jos kaikki on automaattista. Mielestäni pääasia tässä ei olekaan täydellisen versiohallinnan ja muutosten selittäminen, vaan historian mahdollistaminen ympäristöissä, joissa ei muuten jäisi historiaa talteen.

Tällä hetkellä scripti poimii proseduurien, funktioiden, taulujen ja näkymien muutokset. Tätä on helppo laajentaa sillä triggereitä on helppo jatkaa ja SMO mahdollistaa helpohkon tavan luoda erilaisille objecteille scriptejä.

Jos kiinnostus heräsi, alla on linkki github repositoryyn, jossa voit käydä selailemassa koodeja tai käydä lataamassa sovelluksen itsellesi. Asennukseen on muutama scripti ja ohjeet. Githubiin tullaan myös julkaisemaan jo tiedossa olevat ongelmat. Jos heräsi kysymyksiä tai kommentteja, jätä viestiä githubiin tai laita postia timo.myllymaki@oiwasolutions.fi.

https://github.com/oiwa-solutions/sql-server-git-sync

phoneenvelopelocation-arrow linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram