Database laten maken of zelf doen?
Steeds meer bedrijven willen uiteindelijk een database bouwen.
Dit moet je weten over de cloud.
Aan het aantal aanvragen merken wij wel dat het beheer van databases steeds vaker uit handen wordt gegeven.
Wie gaat het beheer doen?
In dit artikel gaan we de verschillende mogelijkheden en kosten van beide opties doornemen.
Mocht u vragen hebben dan is Virtual Assistant Nederland uiteraard altijd te bereiken!
Contact ons vandaag nog voor een vrijblijvende offerte op maat.
Dit moet je weten over de cloud.
Aan het aantal aanvragen merken wij wel dat het beheer van databases steeds vaker uit handen wordt gegeven.
Wie gaat het beheer doen?
In dit artikel gaan we de verschillende mogelijkheden en kosten van beide opties doornemen.
Mocht u vragen hebben dan is Virtual Assistant Nederland uiteraard altijd te bereiken!
Contact ons vandaag nog voor een vrijblijvende offerte op maat.
Database bouwen
Het doel van het bouwen van een database is eenvoudig: bewijs dat wat u qua kennis hebt, met succes een werkende database kan bouwen.
Ontdek ook de kracht van een data analist.
En toch worstelen veel teams met onbetrouwbare en ongeteste databaseopbouwprocessen die implementaties vertragen en de levering van nieuwe functionaliteit verhinderen.
Virtual Assistant Nederland legt uit hoe u een geautomatiseerde en betrouwbare databaseopbouw kunt realiseren die slechts zo complex is als het databasesysteem dat nodig is.
Geautomatiseerde implementatie
Welke methode u ook gebruikt om een database te bouwen, het is belangrijk om deze regelmatig te bouwen op basis van de DDL scripts en ander materiaal in versiebeheer.
Het controleert of elke versie daadwerkelijk met succes kan worden gebouwd, wijst op mogelijke problemen voordat ze problemen worden, en voorkomt dat werk verloren gaat.
De noodzaak om regelmatig builds uit te voeren, betekent dat het zo gemakkelijk mogelijk moet worden gemaakt, zodat het een routinematig onderdeel van de workflow wordt.
Voor een eenvoudige database is dit bouwproces triviaal.
Maar het wordt lastiger om goed te doen naarmate de database complexer wordt.
In dit artikel leggen we uit wat we bedoelen met 'bouwen' van een database en stellen we vervolgens voor hoe DLM technieken kunnen worden toegepast om deze geautomatiseerd, voorspelbaar en meetbaar te bouwen.
Ontdek ook de kracht van een data analist.
En toch worstelen veel teams met onbetrouwbare en ongeteste databaseopbouwprocessen die implementaties vertragen en de levering van nieuwe functionaliteit verhinderen.
Virtual Assistant Nederland legt uit hoe u een geautomatiseerde en betrouwbare databaseopbouw kunt realiseren die slechts zo complex is als het databasesysteem dat nodig is.
Geautomatiseerde implementatie
Welke methode u ook gebruikt om een database te bouwen, het is belangrijk om deze regelmatig te bouwen op basis van de DDL scripts en ander materiaal in versiebeheer.
Het controleert of elke versie daadwerkelijk met succes kan worden gebouwd, wijst op mogelijke problemen voordat ze problemen worden, en voorkomt dat werk verloren gaat.
De noodzaak om regelmatig builds uit te voeren, betekent dat het zo gemakkelijk mogelijk moet worden gemaakt, zodat het een routinematig onderdeel van de workflow wordt.
Voor een eenvoudige database is dit bouwproces triviaal.
Maar het wordt lastiger om goed te doen naarmate de database complexer wordt.
In dit artikel leggen we uit wat we bedoelen met 'bouwen' van een database en stellen we vervolgens voor hoe DLM technieken kunnen worden toegepast om deze geautomatiseerd, voorspelbaar en meetbaar te bouwen.
Wat is een databaseopbouw?
Bij applicatieontwikkeling bouwen we een werkende applicatie uit de samenstellende delen, compileren deze in de juiste volgorde en koppelen en verpakken deze vervolgens.
Het 'build-proces' zal alles doen wat nodig is om de werkruimte voor de applicatie te creëren of bij te werken, en alle basislijnen en rapportages over de build te beheren.
Evenzo is het doel van het bouwen van een database om te bewijzen dat wat we in het versiebeheersysteem hebben - de canonieke bron - met succes een volledig nieuwe database kan bouwen.
Het bouwproces heeft tot doel om vanuit de samenstellende DDL-aanmaakscripts en andere componenten, in de versiebeheerrepository, een werkende database naar een bepaalde versie te creëren.
De beste database oplossing
Het zal een nieuwe database bouwen, zijn objecten creëren en alle statische, referentie- of opzoekgegevens laden.
Aangezien we een geheel nieuwe database aan het bouwen zijn, zal een database build niet proberen de bestaande database of zijn gegevens te behouden.
In feite zullen veel build-processen, door het ontwerp, mislukken als er al een database met dezelfde naam bestaat in de doelomgeving, in plaats van het risico te lopen dat een commando op de verkeerde server wordt uitgevoerd!
Het 'build-proces' zal alles doen wat nodig is om de werkruimte voor de applicatie te creëren of bij te werken, en alle basislijnen en rapportages over de build te beheren.
Evenzo is het doel van het bouwen van een database om te bewijzen dat wat we in het versiebeheersysteem hebben - de canonieke bron - met succes een volledig nieuwe database kan bouwen.
Het bouwproces heeft tot doel om vanuit de samenstellende DDL-aanmaakscripts en andere componenten, in de versiebeheerrepository, een werkende database naar een bepaalde versie te creëren.
De beste database oplossing
Het zal een nieuwe database bouwen, zijn objecten creëren en alle statische, referentie- of opzoekgegevens laden.
Aangezien we een geheel nieuwe database aan het bouwen zijn, zal een database build niet proberen de bestaande database of zijn gegevens te behouden.
In feite zullen veel build-processen, door het ontwerp, mislukken als er al een database met dezelfde naam bestaat in de doelomgeving, in plaats van het risico te lopen dat een commando op de verkeerde server wordt uitgevoerd!
Bouw versus migraties
In omgevingen zoals Productie, Staging of User Acceptance Testing (UAT), gebruiken teams soms de term 'de build' algemener, we bedoelen: ‘de misvorming dat de vereiste versie van de database in die omgeving zal vaststellen '.
Tenzij de database nog niet bestaat, is 'de build' in deze omgevingen in feite een migratie, en zal de bestaande database worden aangepast aan de vereiste versie.
Dit terwijl de bestaande gegevens behouden blijven, in plaats van "afbreken en opnieuw beginnen". In dit artikel richten we ons alleen op het bouwen van een database.
Database ontwikkelen
Een database zal waarschijnlijk vele malen worden gebouwd tijdens het ontwikkelings- en testproces.
Als het eenmaal volledig is getest, in ontwikkeling, zouden we hetzelfde buildproces op alle omgevingen moeten kunnen gebruiken, ervan uitgaande dat we de omgevingsafhankelijkheden hebben gescheiden van het build script zelf.
Een belangrijke build is degene die de release candidate produceert, en een volgende implementatie omvat hetzelfde buildproces, maar met extra fasen.
Bijvoorbeeld om rekening te houden met de instellingen van de productieserver en om de productiebeveiliging te integreren en om een productiearchitectuur op te nemen die niet aanwezig is in de ontwikkeling, zoals SQL Server-replicatie.
In feite verwijst Microsoft naar een build als ' het mechanisme dat de noodzakelijke objecten creëert voor een database-implementatie '.
Database definitie
Een build is volgens hun definitie slechts het bouwen van een script of een DACPAC bestand. Vervolgens verwijzen ze naar het toepassen van dat script op de database als het publiceren van de build.
Het snelle en efficiënte bouwproces is essentieel voor sommige databases die in verschillende varianten worden uitgebracht voor individuele 'klanten' of installaties voor een bepaalde versie.
Het is in deze ontwikkelomgevingen dat een bouwproces dat zijn bron haalt uit de VCS en strikte 'versiebeheer' handhaaft, tot zijn recht komt.
Tenzij de database nog niet bestaat, is 'de build' in deze omgevingen in feite een migratie, en zal de bestaande database worden aangepast aan de vereiste versie.
Dit terwijl de bestaande gegevens behouden blijven, in plaats van "afbreken en opnieuw beginnen". In dit artikel richten we ons alleen op het bouwen van een database.
Database ontwikkelen
Een database zal waarschijnlijk vele malen worden gebouwd tijdens het ontwikkelings- en testproces.
Als het eenmaal volledig is getest, in ontwikkeling, zouden we hetzelfde buildproces op alle omgevingen moeten kunnen gebruiken, ervan uitgaande dat we de omgevingsafhankelijkheden hebben gescheiden van het build script zelf.
Een belangrijke build is degene die de release candidate produceert, en een volgende implementatie omvat hetzelfde buildproces, maar met extra fasen.
Bijvoorbeeld om rekening te houden met de instellingen van de productieserver en om de productiebeveiliging te integreren en om een productiearchitectuur op te nemen die niet aanwezig is in de ontwikkeling, zoals SQL Server-replicatie.
In feite verwijst Microsoft naar een build als ' het mechanisme dat de noodzakelijke objecten creëert voor een database-implementatie '.
Database definitie
Een build is volgens hun definitie slechts het bouwen van een script of een DACPAC bestand. Vervolgens verwijzen ze naar het toepassen van dat script op de database als het publiceren van de build.
Het snelle en efficiënte bouwproces is essentieel voor sommige databases die in verschillende varianten worden uitgebracht voor individuele 'klanten' of installaties voor een bepaalde versie.
Het is in deze ontwikkelomgevingen dat een bouwproces dat zijn bron haalt uit de VCS en strikte 'versiebeheer' handhaaft, tot zijn recht komt.
Het doel van de database build
Vanuit het perspectief van de databaseontwikkelaar zorgt een build voor een regelmatige gezondheidscontrole van de database.
Tijdens de ontwikkeling moet het buildproces worden geautomatiseerd en regelmatig worden uitgevoerd.
Dit omdat het het team vertelt of het mogelijk is om dit te doen met de nieuwste versie van de gecommitteerde code, en het hele team up-to-date houdt met de nieuwste ontwikkelversie.
De canonieke database is het resultaat is van een succesvolle build.
Dit kan ook worden vergeleken met andere ontwikkelingsversies om er zeker van te zijn dat ze up to date zijn, en kan worden gebruikt voor een verscheidenheid aan routinematige integratie en prestatietests.
Als de build ook voldoende is geïnstrumenteerd (zie later) en als een build kapot gaat of abnormaal lang loopt, heeft het team toegang nodig tot gedetailleerde diagnostische informatie en foutbeschrijvingen waarmee ze de exacte breukwijziging kunnen identificeren en deze snel kunnen oplossen.
In een gedeelde ontwikkelomgeving is het mogelijk om het bouwen van de database te vermijden.
Een handmatig en slecht getest bouwproces leidt echter onvermijdelijk tot vertraagde en onbetrouwbare database-implementaties.
Het databaseopbouwproces wordt een bottleneck voor alle downline implementatieprocessen en de implementatie van de applicatie moet wachten terwijl de handmatige stappen die nodig zijn voor het bouwen van de database, worden doorlopen.
Omdat deze processen waarschijnlijk handmatig zijn, zijn ze bovendien veel gevoeliger voor fouten.
Dit betekent dat de applicatie-implementatie wacht op een database-implementatie die misschien niet eens correct is wanneer deze uiteindelijk wordt voltooid.
Een database opbouwproces dat vaak wordt afgebroken en vervolgens stroom afwaartse problemen veroorzaakt met een database-implementatie.
Dit zal het vertrouwen van de andere IT teams schaden, misschien zelfs zo ver dat ze het ontwikkelingsteam verzoeken om minder frequente releases uit te voeren, totdat alle problemen met het bouwen van de database zijn opgelost.
Onbetrouwbare databaseopbouwprocessen (evenals onbetrouwbare migratieprocessen) kunnen voorkomen dat de applicaties die de database gebruiken, snel genoeg nieuwe functionaliteit leveren.
Database lifecycle management
Database lifecycle management (DLM) kan niet effectief worden uitgevoerd, tenzij u uw database-builds onder controle krijgt binnen de ontwikkelomgeving.
Omgekeerd, als geautomatiseerde builds regelmatig en soepel verlopen, ervan uitgaande dat alle benodigde database- en server level objecten in de build zijn verwerkt.
Dit zal het team er zeker van zijn dat er weinig mis kan gaan wanneer het door het releaseproces naar de implementatie wordt geleid. Database advies nodig? Contact ons dan meteen.
Tijdens de ontwikkeling moet het buildproces worden geautomatiseerd en regelmatig worden uitgevoerd.
Dit omdat het het team vertelt of het mogelijk is om dit te doen met de nieuwste versie van de gecommitteerde code, en het hele team up-to-date houdt met de nieuwste ontwikkelversie.
De canonieke database is het resultaat is van een succesvolle build.
Dit kan ook worden vergeleken met andere ontwikkelingsversies om er zeker van te zijn dat ze up to date zijn, en kan worden gebruikt voor een verscheidenheid aan routinematige integratie en prestatietests.
Als de build ook voldoende is geïnstrumenteerd (zie later) en als een build kapot gaat of abnormaal lang loopt, heeft het team toegang nodig tot gedetailleerde diagnostische informatie en foutbeschrijvingen waarmee ze de exacte breukwijziging kunnen identificeren en deze snel kunnen oplossen.
In een gedeelde ontwikkelomgeving is het mogelijk om het bouwen van de database te vermijden.
Een handmatig en slecht getest bouwproces leidt echter onvermijdelijk tot vertraagde en onbetrouwbare database-implementaties.
Het databaseopbouwproces wordt een bottleneck voor alle downline implementatieprocessen en de implementatie van de applicatie moet wachten terwijl de handmatige stappen die nodig zijn voor het bouwen van de database, worden doorlopen.
Omdat deze processen waarschijnlijk handmatig zijn, zijn ze bovendien veel gevoeliger voor fouten.
Dit betekent dat de applicatie-implementatie wacht op een database-implementatie die misschien niet eens correct is wanneer deze uiteindelijk wordt voltooid.
Een database opbouwproces dat vaak wordt afgebroken en vervolgens stroom afwaartse problemen veroorzaakt met een database-implementatie.
Dit zal het vertrouwen van de andere IT teams schaden, misschien zelfs zo ver dat ze het ontwikkelingsteam verzoeken om minder frequente releases uit te voeren, totdat alle problemen met het bouwen van de database zijn opgelost.
Onbetrouwbare databaseopbouwprocessen (evenals onbetrouwbare migratieprocessen) kunnen voorkomen dat de applicaties die de database gebruiken, snel genoeg nieuwe functionaliteit leveren.
Database lifecycle management
Database lifecycle management (DLM) kan niet effectief worden uitgevoerd, tenzij u uw database-builds onder controle krijgt binnen de ontwikkelomgeving.
Omgekeerd, als geautomatiseerde builds regelmatig en soepel verlopen, ervan uitgaande dat alle benodigde database- en server level objecten in de build zijn verwerkt.
Dit zal het team er zeker van zijn dat er weinig mis kan gaan wanneer het door het releaseproces naar de implementatie wordt geleid. Database advies nodig? Contact ons dan meteen.
De mechanica van het bouwen van een database
Het mechanisme voor het bouwen van een database zal uit het versiebeheersysteem de juiste versie van alle benodigde componenten moeten halen.
Dit omvat meestal de scripts om alle schema scoped objecten te bouwen, zoals:
Het zal ook de nodige 'statische' gegevens moeten laden.
Een veelgebruikte manier om de database in versiebeheer weer te geven, is als een set afzonderlijke objectscripts.
Het is meestal een gemakkelijke manier om een databasesysteem te ‘versieren’, omdat u een nuttige en gemakkelijk toegankelijke geschiedenis van wijzigingen aan elk object krijgt.
Ook is het de meest betrouwbare manier om ervoor te zorgen dat twee mensen niet per ongeluk aan dezelfde set objecten werken.
Het is echter niet de enige legitieme manier om de bron van een database op te slaan in een versiebeheersysteem.
Bij het bouwen van veel databases is het in feite onwaarschijnlijk dat u elke tabel afzonderlijk via instructies wilt bouwen.
Vanuit een enkel scriptbestand kan een kleinschalige database worden opgebouwd.
Als u wilt, kunt u elk schema afzonderlijk uitschrijven.
Voor grotere, complexere databases, waar het voor het team steeds belangrijker wordt om de huidige status van een bepaald object te kunnen zien, zul je waarschijnlijk DDL-scripts op objectniveau aan het versiebeheer hebben.
Scripting van de database objecten
Veel databases kunnen uitsluitend worden gebouwd met scripts die de:
Er zijn echter meer dan vijftig mogelijke typen databaseobjecten in SQL Server die deel kunnen uitbouwen van een build.
De overgrote meerderheid is scriptbaar.
Tabellen zijn verreweg de meest complexe scriptbare componenten van een database en ze bezorgen de ontwikkelaar het meeste verdriet.
In SQL Server worden tabellen weergegeven als objecten, maar het schema waarin het zich bevindt is dat niet.
De samenstellende onderdelen van een tabel zijn onderliggende objecten of eigenschappen in een enigszins verwarrende hiërarchie.
Dit omvat meestal de scripts om alle schema scoped objecten te bouwen, zoals:
- Tabellen
- Opgeslagen procedures
- Functies
- Views
- Aggregaten
- Synoniemen
- Wachtrijen
Het zal ook de nodige 'statische' gegevens moeten laden.
Een veelgebruikte manier om de database in versiebeheer weer te geven, is als een set afzonderlijke objectscripts.
Het is meestal een gemakkelijke manier om een databasesysteem te ‘versieren’, omdat u een nuttige en gemakkelijk toegankelijke geschiedenis van wijzigingen aan elk object krijgt.
Ook is het de meest betrouwbare manier om ervoor te zorgen dat twee mensen niet per ongeluk aan dezelfde set objecten werken.
Het is echter niet de enige legitieme manier om de bron van een database op te slaan in een versiebeheersysteem.
Bij het bouwen van veel databases is het in feite onwaarschijnlijk dat u elke tabel afzonderlijk via instructies wilt bouwen.
Vanuit een enkel scriptbestand kan een kleinschalige database worden opgebouwd.
Als u wilt, kunt u elk schema afzonderlijk uitschrijven.
Voor grotere, complexere databases, waar het voor het team steeds belangrijker wordt om de huidige status van een bepaald object te kunnen zien, zul je waarschijnlijk DDL-scripts op objectniveau aan het versiebeheer hebben.
Scripting van de database objecten
Veel databases kunnen uitsluitend worden gebouwd met scripts die de:
- Schema's
- Databaserollen
- Tabellen
- Views
- Procedures
- Functies
- Triggers bouwen
Er zijn echter meer dan vijftig mogelijke typen databaseobjecten in SQL Server die deel kunnen uitbouwen van een build.
De overgrote meerderheid is scriptbaar.
Tabellen zijn verreweg de meest complexe scriptbare componenten van een database en ze bezorgen de ontwikkelaar het meeste verdriet.
In SQL Server worden tabellen weergegeven als objecten, maar het schema waarin het zich bevindt is dat niet.
De samenstellende onderdelen van een tabel zijn onderliggende objecten of eigenschappen in een enigszins verwarrende hiërarchie.
Eigenschappen van een database tabel
Tabellen kunnen in één stap worden opgebouwd met een create table instructie of kunnen worden samengesteld uit de oorspronkelijke create table instructie en vervolgens worden gebouwd met kolommen, beperkingen, foreign key beperkingen door middel van alter table instructies.
Ongetwijfeld kunnen tabelscripts het beste op de eerste manier op tafelniveau worden geschreven in plaats van de laatste methode om de onderliggende objecten en eigenschappen op zichzelf te behandelen.
Het is duidelijker om te lezen en laat in één weergave zien wat er tussen de versies van de tabel is veranderd. Het geeft een veel beknoptere geschiedenis van de veranderingen.
Server gebaseerde objecten scripts
Het is een vergissing om te denken dat door de databaseobjecten in bronbeheer op te slaan en deze te bouwen, u de volledige database hebt.
Sommige componenten worden niet echt in de database opgeslagen.
Als ze worden gebruikt, kunnen ze zich op serverniveau en/ of in SQL Agent bevinden.
Als deze serverobjecten, zoals database-mailprofielen, log-ins, SQL Agent-taken en -waarschuwingen, schema's, servertriggers, proxyaccounts, gekoppelde servers, vereist zijn voor het functioneren van de database, dan moeten ze bij de ontwikkeling als SQL-scripts worden bewaard en gebouwd met de database.
Sommige server gebaseerde objecten zijn gekoppeld aan de databasetoepassing, maar hebben voor elke serveromgeving geheel andere scripts nodig.
Operators, de contactgegevens van de persoon die wordt gewaarschuwd als een database fout gaat, zijn een eenvoudig voorbeeld van dit type script.
Terwijl we ons voorbereiden om de database in productie te nemen, moet hetzelfde buildproces in staat zijn om de juiste operator in elke omgeving te definiëren, of het nu gaat om ontwikkeling, test, integratie, staging of productie.
SQL database
SQL Server Management Objects (SMO) brengt server-niveau voorwerpen door de server en job server klassen, en we kunnen een PowerShell script maken, bijvoorbeeld, te herhalen over alle van de verschillende collecties van deze klasse, die de banen en waarschuwingen en andere server-objecten, samen met bijbehorende operators, schema's enzovoort.
In veel organisaties worden scripts voor deze serverobjecten waarschijnlijk opgeslagen in een afzonderlijk versiebeheersysteem onder controle van het operationele of productie-DBA-personeel, op de centrale beheerserver.
In veel gevallen worden ze doorgaans niet in ontwikkelingsscripts voor productie opgenomen. Als zodanig worden de details van het omgaan met deze serverobjecten tijdens een volgende implementatie opgeslagen.
Een DLM-benadering van het bouwen van databases vereist echter dat de ontwikkelomgeving de productie zo goed mogelijk nabootst, en van vroege en frequente samenwerking tussen ontwikkelingsteams, governance- en operationele teams, om bouwproblemen zoveel mogelijk te vermijden, die voortkomen uit verschillen tussen serveromgevingen.
Ongetwijfeld kunnen tabelscripts het beste op de eerste manier op tafelniveau worden geschreven in plaats van de laatste methode om de onderliggende objecten en eigenschappen op zichzelf te behandelen.
Het is duidelijker om te lezen en laat in één weergave zien wat er tussen de versies van de tabel is veranderd. Het geeft een veel beknoptere geschiedenis van de veranderingen.
Server gebaseerde objecten scripts
Het is een vergissing om te denken dat door de databaseobjecten in bronbeheer op te slaan en deze te bouwen, u de volledige database hebt.
Sommige componenten worden niet echt in de database opgeslagen.
Als ze worden gebruikt, kunnen ze zich op serverniveau en/ of in SQL Agent bevinden.
Als deze serverobjecten, zoals database-mailprofielen, log-ins, SQL Agent-taken en -waarschuwingen, schema's, servertriggers, proxyaccounts, gekoppelde servers, vereist zijn voor het functioneren van de database, dan moeten ze bij de ontwikkeling als SQL-scripts worden bewaard en gebouwd met de database.
Sommige server gebaseerde objecten zijn gekoppeld aan de databasetoepassing, maar hebben voor elke serveromgeving geheel andere scripts nodig.
Operators, de contactgegevens van de persoon die wordt gewaarschuwd als een database fout gaat, zijn een eenvoudig voorbeeld van dit type script.
Terwijl we ons voorbereiden om de database in productie te nemen, moet hetzelfde buildproces in staat zijn om de juiste operator in elke omgeving te definiëren, of het nu gaat om ontwikkeling, test, integratie, staging of productie.
SQL database
SQL Server Management Objects (SMO) brengt server-niveau voorwerpen door de server en job server klassen, en we kunnen een PowerShell script maken, bijvoorbeeld, te herhalen over alle van de verschillende collecties van deze klasse, die de banen en waarschuwingen en andere server-objecten, samen met bijbehorende operators, schema's enzovoort.
In veel organisaties worden scripts voor deze serverobjecten waarschijnlijk opgeslagen in een afzonderlijk versiebeheersysteem onder controle van het operationele of productie-DBA-personeel, op de centrale beheerserver.
In veel gevallen worden ze doorgaans niet in ontwikkelingsscripts voor productie opgenomen. Als zodanig worden de details van het omgaan met deze serverobjecten tijdens een volgende implementatie opgeslagen.
Een DLM-benadering van het bouwen van databases vereist echter dat de ontwikkelomgeving de productie zo goed mogelijk nabootst, en van vroege en frequente samenwerking tussen ontwikkelingsteams, governance- en operationele teams, om bouwproblemen zoveel mogelijk te vermijden, die voortkomen uit verschillen tussen serveromgevingen.
De build scripts
Een databaseopbouwproces moet ongeveer net zo complex zijn als het databasesysteem dat het moet bouwen.
Voor een kleine database kan een enkel build script de hele database omvatten.
Naarmate een database groter wordt, kan het bereik eerst worden verkleind tot het schemaniveau en tenslotte tot het objectniveau.
Om productief te zijn, zult u waarschijnlijk verschillende tools en technieken gebruiken.
Als u een diagramtool voor entiteit-relaties gebruikt, zoals de tool voor het ontwerpen van tabellen in SSMS, of een van de vele andere tools voor het ontwerpen van tabellen op de markt, om de database te ontwerpen, kunt u de 'first-cut' bouwen door de scripts voor het bouwen van tabellen rechtstreeks vanuit de tool.
Onthoud echter dat het dan de verantwoordelijkheid van de bouwer is om dat 'gegenereerde' script vervolgens te bewerken om ervoor te zorgen dat het script voldoet aan de huisstijl en normen-
En dat het adequaat wordt becommentarieerd om ervoor te zorgen dat het hele team het doel van elk object begrijpt.
Het is een slecht idee om er een gewoonte van te bouwen om de broncode van een object van uw ontwikkelserver reverse-engineering te laten uitvoeren om in de VCS op te slaan.
Een tabel kan bijvoorbeeld enigszins worden gewijzigd door een diagramtool als onderdeel van een bredere re-engineeringtaak.
Zou u het gemakkelijk te begrijpen, zorgvuldig gedocumenteerde en handgemaakte tafelscript overschrijven met een gegenereerd script om het bij te werken, en al die extra informatie verliezen?
Het antwoord is waarschijnlijk 'nooit'.
Naast het gebruik van diagramtools en andere visuele tools, zul je waarschijnlijk tabellen uit onbewerkte createstatements 'met de hand knippen’.
Waarschijnlijk in de loop van de tijd 'boiler-plate'-ontwerpen bouwen en hergebruiken voor het omgaan met algemene functionaliteit zoals "namen en adressen".
Je hebt veel vrijheid en meer opties dan je zou wensen.
Eén script wordt gebouwd
Als uw database slechts een handvol tabellen en een paar weergaven en opgeslagen procedures bevat, is er geen gecompliceerd bouwproces nodig met DDL-scripts op objectniveau.
U kunt gewoon in de VSC een enkel build-script opslaan dat de database maakt, en vervolgens alle tabellen en codeobjecten, en alle benodigde gegevens laadt.
Dit script zal referentiële integriteitsbeperkingen opnemen, zodat er geen zorgen zijn over de afhankelijkheidsvolgorde.
Om de 'eerste cut' van een database te bouwen, in versiebeheer, kunt u overwegen het build-script te genereren vanuit een live ontwikkelingsdatabase, met behulp van een database-diagramtool of SSMS, of via een Server Management Objects (SMO) -script.
U kunt dan een tool zoals SQLCMD of PowerShell gebruiken om het script op alle vereiste omgevingen uit te voeren, ervan uitgaande dat u omgevingsafhankelijkheden hebt gescheiden, zoals databaseconfiguratie-eigenschappen, beveiligingsinstellingen, zoals databaserollen, enzovoort.
Met een tool als SQLCMD kunnen we variabelen gebruiken voor eigenschappen zoals databasebestandslocaties, en de juiste waarde voor een bepaalde omgeving wordt ingelezen vanuit een apart bestand.
Bouw op schemaniveau
Een SQL Server werkt natuurlijk op het niveau van het schema.
Database bouwers die een login gebruiken die beperkt is tot het schema waaraan ze werken, zien alleen die schema-objecten en hun scripts bevatten alleen die objecten.
Om dit goed te laten werken, krijgen ze alleen toegang tot scripts op andere schema's via een interface, bestaande uit een view, procedure of functie.
Deze scripts kunnen met de hand worden gesneden, en dit is gebruikelijk in de latere stadia van ontwikkeling. In de eerdere stadia, waar ontwikkelaars GUI tools zoals ER Diagramming hulpprogramma's gebruiken, kan het build script meestal worden gemaakt via een SMO script of via de SSMS GUI.
Bouwt op objectniveau
Uiteindelijk zal een database zo groot worden dat alleen scripting op objectniveau mogelijk is.
Normaal gesproken is dit alleen nodig voor de schema-gebonden objecten zoals tabellen, functies, views en procedures.
Andere database-objecten zoals XML schemacollecties, schema's en service broker objecten kunnen per objecttype samen in één script worden geplaatst.
Er zijn veel op PowerShell gebaseerde scripts die kunnen worden gebruikt om voor het eerst scripts op objectniveau te bouwen als de database voorheen werd opgeslagen in de VCS op database- of schemaniveau, of als de database eerder was 'geknipt' uit een ER diagramtool.
U kunt ook elk object scripten met behulp van een goede database vergelijkingstool die de live ontwikkelingsdatabase als bron vergelijkt met de modeldatabase op dezelfde server.
Voor een kleine database kan een enkel build script de hele database omvatten.
Naarmate een database groter wordt, kan het bereik eerst worden verkleind tot het schemaniveau en tenslotte tot het objectniveau.
Om productief te zijn, zult u waarschijnlijk verschillende tools en technieken gebruiken.
Als u een diagramtool voor entiteit-relaties gebruikt, zoals de tool voor het ontwerpen van tabellen in SSMS, of een van de vele andere tools voor het ontwerpen van tabellen op de markt, om de database te ontwerpen, kunt u de 'first-cut' bouwen door de scripts voor het bouwen van tabellen rechtstreeks vanuit de tool.
Onthoud echter dat het dan de verantwoordelijkheid van de bouwer is om dat 'gegenereerde' script vervolgens te bewerken om ervoor te zorgen dat het script voldoet aan de huisstijl en normen-
En dat het adequaat wordt becommentarieerd om ervoor te zorgen dat het hele team het doel van elk object begrijpt.
Het is een slecht idee om er een gewoonte van te bouwen om de broncode van een object van uw ontwikkelserver reverse-engineering te laten uitvoeren om in de VCS op te slaan.
Een tabel kan bijvoorbeeld enigszins worden gewijzigd door een diagramtool als onderdeel van een bredere re-engineeringtaak.
Zou u het gemakkelijk te begrijpen, zorgvuldig gedocumenteerde en handgemaakte tafelscript overschrijven met een gegenereerd script om het bij te werken, en al die extra informatie verliezen?
Het antwoord is waarschijnlijk 'nooit'.
Naast het gebruik van diagramtools en andere visuele tools, zul je waarschijnlijk tabellen uit onbewerkte createstatements 'met de hand knippen’.
Waarschijnlijk in de loop van de tijd 'boiler-plate'-ontwerpen bouwen en hergebruiken voor het omgaan met algemene functionaliteit zoals "namen en adressen".
Je hebt veel vrijheid en meer opties dan je zou wensen.
Eén script wordt gebouwd
Als uw database slechts een handvol tabellen en een paar weergaven en opgeslagen procedures bevat, is er geen gecompliceerd bouwproces nodig met DDL-scripts op objectniveau.
U kunt gewoon in de VSC een enkel build-script opslaan dat de database maakt, en vervolgens alle tabellen en codeobjecten, en alle benodigde gegevens laadt.
Dit script zal referentiële integriteitsbeperkingen opnemen, zodat er geen zorgen zijn over de afhankelijkheidsvolgorde.
Om de 'eerste cut' van een database te bouwen, in versiebeheer, kunt u overwegen het build-script te genereren vanuit een live ontwikkelingsdatabase, met behulp van een database-diagramtool of SSMS, of via een Server Management Objects (SMO) -script.
U kunt dan een tool zoals SQLCMD of PowerShell gebruiken om het script op alle vereiste omgevingen uit te voeren, ervan uitgaande dat u omgevingsafhankelijkheden hebt gescheiden, zoals databaseconfiguratie-eigenschappen, beveiligingsinstellingen, zoals databaserollen, enzovoort.
Met een tool als SQLCMD kunnen we variabelen gebruiken voor eigenschappen zoals databasebestandslocaties, en de juiste waarde voor een bepaalde omgeving wordt ingelezen vanuit een apart bestand.
Bouw op schemaniveau
Een SQL Server werkt natuurlijk op het niveau van het schema.
Database bouwers die een login gebruiken die beperkt is tot het schema waaraan ze werken, zien alleen die schema-objecten en hun scripts bevatten alleen die objecten.
Om dit goed te laten werken, krijgen ze alleen toegang tot scripts op andere schema's via een interface, bestaande uit een view, procedure of functie.
Deze scripts kunnen met de hand worden gesneden, en dit is gebruikelijk in de latere stadia van ontwikkeling. In de eerdere stadia, waar ontwikkelaars GUI tools zoals ER Diagramming hulpprogramma's gebruiken, kan het build script meestal worden gemaakt via een SMO script of via de SSMS GUI.
Bouwt op objectniveau
Uiteindelijk zal een database zo groot worden dat alleen scripting op objectniveau mogelijk is.
Normaal gesproken is dit alleen nodig voor de schema-gebonden objecten zoals tabellen, functies, views en procedures.
Andere database-objecten zoals XML schemacollecties, schema's en service broker objecten kunnen per objecttype samen in één script worden geplaatst.
Er zijn veel op PowerShell gebaseerde scripts die kunnen worden gebruikt om voor het eerst scripts op objectniveau te bouwen als de database voorheen werd opgeslagen in de VCS op database- of schemaniveau, of als de database eerder was 'geknipt' uit een ER diagramtool.
U kunt ook elk object scripten met behulp van een goede database vergelijkingstool die de live ontwikkelingsdatabase als bron vergelijkt met de modeldatabase op dezelfde server.
Het bouwproces van een database
Welk niveau van build script het meest geschikt is voor de fase van database bouw, dat maakt niet uit, het is altijd het beste om de bron op te slaan in een VCS archief.
Het eerste voordeel is dat het gemakkelijk is om de wijzigingsgeschiedenis te controleren via standaard VCS mechanismen en snel te identificeren wie code heeft toegevoegd of verwijderd.
Het tweede voordeel is de verstaanbaarheid, omdat de VCS altijd het laatste build-script voor elk object bevat, idealiter goed opgemaakt en royaal becommentarieerd.
Het create script voor een tabel kan bijvoorbeeld complex zijn.
Er zijn veel ondergeschikte 'objecten' die niet bestaan zonder de tabel, zoals beperkingen, indexen, triggers en sleutels.
Een goed tafelscript wordt rijkelijk besprenkeld met opmerkingen, en het script definieert tegelijkertijd alle ondergeschikte objecten. De tabel is opgemaakt om deze beter verstaanbaar te bouwen.
Kolombeperkingen worden gemaakt met de kolommen in plaats van achteraf te worden gevolgd als alter table bijzaak. Tabelbeperkingen worden op dezelfde manier op tafelniveau geplaatst.
Door in de VCS een goed gedocumenteerd build-script voor elk object te hebben, is het voor het team heel gemakkelijk om de exacte staat van een object op een bepaald moment te zien.
Om te begrijpen hoe veranderingen aan dat object waarschijnlijk van invloed zijn op andere objecten.
Handmatige builds van database-objectscripts
Als we individuele objectscripts opslaan in versiebeheer om vervolgens een volledig werkende database op te bouwen, moeten we deze scripts op de doelserver uitvoeren, in de juiste volgorde.
Ten eerste voeren we een script uit om de lege database zelf te bouwen, en vervolgens gebruiken we die database als context voor het bouwen van de individuele schema's en de objecten die erin zullen staan, per objecttype en in de juiste afhankelijkheidsvolgorde.
Ten slotte laden we alle opzoekgegevens (of statische gegevens) die door de toepassing worden gebruikt.
We kunnen zelfs enkele operationele gegevens laden, indien nodig.
Er zijn ook andere scripts waarmee u rekening moet houden, zoals scripts om databaserollen te bouwen, die voor elke omgeving afzonderlijk worden toegewezen aan gebruikers, en scripts om objecten en eigenschappen op serverniveau in te stellen, zoals eerder besproken.
Om alle vereiste database-objecten in de juiste volgorde te bouwen, kunt u deze individuele bestanden specificeren in een 'manifest'-bestand, bijvoorbeeld als een SQLCMD' manifest'-bestand, met behulp van het ' :r' commando, en dit kan vervolgens worden uitgevoerd om de bouwen.
Een SQLCMD-bestand kan ook het pre-build en post-build script specificeren (zie later in dit artikel) en wordt bewaard in de VCS, en kan worden bijgewerkt wanneer er een nieuw databaseobject wordt gemaakt.
Het manifest is nodig omdat de objecten in de juiste afhankelijkheidsvolgorde moeten worden gebouwd.
SQL Server controleert bijvoorbeeld of elke tabel waarnaar wordt verwezen, foreign key daadwerkelijk bestaat. Als het er niet is op het moment dat u de create instructie uitvoert, wordt de build afgebroken.
De veilige volgorde van het bouwen van tabellen is niet eenvoudig te bepalen en het is zelfs mogelijk om circulaire afhankelijkheden te creëren die elke build op objectniveau zullen verslaan.
Er zijn manieren om deze moeilijkheid te omzeilen, zoals:
Het buildproces kan echter zeer snel ingewikkeld en foutgevoelig worden als u het build script met de hand samenstelt.
Het 'manifest'-bestand moet indien nodig worden gewijzigd en kan een oorzaak van fouten worden wanneer de database in omvang en complexiteit toeneemt.
Op dat moment moet u de build uitgebreider automatiseren om het manifest overbodig te bouwen.
Het eerste voordeel is dat het gemakkelijk is om de wijzigingsgeschiedenis te controleren via standaard VCS mechanismen en snel te identificeren wie code heeft toegevoegd of verwijderd.
Het tweede voordeel is de verstaanbaarheid, omdat de VCS altijd het laatste build-script voor elk object bevat, idealiter goed opgemaakt en royaal becommentarieerd.
Het create script voor een tabel kan bijvoorbeeld complex zijn.
Er zijn veel ondergeschikte 'objecten' die niet bestaan zonder de tabel, zoals beperkingen, indexen, triggers en sleutels.
Een goed tafelscript wordt rijkelijk besprenkeld met opmerkingen, en het script definieert tegelijkertijd alle ondergeschikte objecten. De tabel is opgemaakt om deze beter verstaanbaar te bouwen.
Kolombeperkingen worden gemaakt met de kolommen in plaats van achteraf te worden gevolgd als alter table bijzaak. Tabelbeperkingen worden op dezelfde manier op tafelniveau geplaatst.
Door in de VCS een goed gedocumenteerd build-script voor elk object te hebben, is het voor het team heel gemakkelijk om de exacte staat van een object op een bepaald moment te zien.
Om te begrijpen hoe veranderingen aan dat object waarschijnlijk van invloed zijn op andere objecten.
Handmatige builds van database-objectscripts
Als we individuele objectscripts opslaan in versiebeheer om vervolgens een volledig werkende database op te bouwen, moeten we deze scripts op de doelserver uitvoeren, in de juiste volgorde.
Ten eerste voeren we een script uit om de lege database zelf te bouwen, en vervolgens gebruiken we die database als context voor het bouwen van de individuele schema's en de objecten die erin zullen staan, per objecttype en in de juiste afhankelijkheidsvolgorde.
Ten slotte laden we alle opzoekgegevens (of statische gegevens) die door de toepassing worden gebruikt.
We kunnen zelfs enkele operationele gegevens laden, indien nodig.
Er zijn ook andere scripts waarmee u rekening moet houden, zoals scripts om databaserollen te bouwen, die voor elke omgeving afzonderlijk worden toegewezen aan gebruikers, en scripts om objecten en eigenschappen op serverniveau in te stellen, zoals eerder besproken.
Om alle vereiste database-objecten in de juiste volgorde te bouwen, kunt u deze individuele bestanden specificeren in een 'manifest'-bestand, bijvoorbeeld als een SQLCMD' manifest'-bestand, met behulp van het ' :r' commando, en dit kan vervolgens worden uitgevoerd om de bouwen.
Een SQLCMD-bestand kan ook het pre-build en post-build script specificeren (zie later in dit artikel) en wordt bewaard in de VCS, en kan worden bijgewerkt wanneer er een nieuw databaseobject wordt gemaakt.
Het manifest is nodig omdat de objecten in de juiste afhankelijkheidsvolgorde moeten worden gebouwd.
SQL Server controleert bijvoorbeeld of elke tabel waarnaar wordt verwezen, foreign key daadwerkelijk bestaat. Als het er niet is op het moment dat u de create instructie uitvoert, wordt de build afgebroken.
De veilige volgorde van het bouwen van tabellen is niet eenvoudig te bepalen en het is zelfs mogelijk om circulaire afhankelijkheden te creëren die elke build op objectniveau zullen verslaan.
Er zijn manieren om deze moeilijkheid te omzeilen, zoals:
- Zet de foreign key beperkingen apart in de VCS en voer deze uit nadat de tabellen zijn gemaakt.
- Plaats foreign key beperkingen in het build-script, maar schakel ze uit en voeg een post build script toe om ze in te schakelen.
Het buildproces kan echter zeer snel ingewikkeld en foutgevoelig worden als u het build script met de hand samenstelt.
Het 'manifest'-bestand moet indien nodig worden gewijzigd en kan een oorzaak van fouten worden wanneer de database in omvang en complexiteit toeneemt.
Op dat moment moet u de build uitgebreider automatiseren om het manifest overbodig te bouwen.
Geautomatiseerde builds op basis van objectscripts
Er zijn tools die het genereren van het build-script kunnen automatiseren op basis van scripts op objectniveau.
In wezen bestaan deze tools uit een vergelijkingsengine om het verschil te bepalen tussen de doeldatabase en de bronbestanden en pakketten in de VCS, of een brondatabase.
SQL Compare (Oracle, SQL Server en MySQL) kan een aantal scripts lezen en deze in de juiste volgorde combineren tot een 'synchronisatie'-script.
Deze kan worden uitgevoerd om een nieuwe database te publiceren. In feite is een synchronisatiescript dat publiceert op basis van een volledig lege database, zoals model, een build script.
De tool vergelijkt een live doeldatabase op versie x met bronscripts die de database op versie y beschrijven, en genereert een wijzigingsscript om databaseversie x om te zetten in databaseversie y.
Als uw vergelijkingstool niet kan worden vergeleken met de bronscripts, dan heeft u nog steeds een build van de database nodig vanuit de VCS op versie y.
De DACPAC (SQL Server) werkt nogal anders en vereist dat de ontwikkelaars een logisch 'model' van de database bouwen op basis van scripts.
Het lost het probleem niet op om scripts op objectniveau in de juiste volgorde te krijgen, aangezien het objectmodel in de juiste volgorde moet worden gebouwd!
In wezen bestaan deze tools uit een vergelijkingsengine om het verschil te bepalen tussen de doeldatabase en de bronbestanden en pakketten in de VCS, of een brondatabase.
SQL Compare (Oracle, SQL Server en MySQL) kan een aantal scripts lezen en deze in de juiste volgorde combineren tot een 'synchronisatie'-script.
Deze kan worden uitgevoerd om een nieuwe database te publiceren. In feite is een synchronisatiescript dat publiceert op basis van een volledig lege database, zoals model, een build script.
De tool vergelijkt een live doeldatabase op versie x met bronscripts die de database op versie y beschrijven, en genereert een wijzigingsscript om databaseversie x om te zetten in databaseversie y.
Als uw vergelijkingstool niet kan worden vergeleken met de bronscripts, dan heeft u nog steeds een build van de database nodig vanuit de VCS op versie y.
De DACPAC (SQL Server) werkt nogal anders en vereist dat de ontwikkelaars een logisch 'model' van de database bouwen op basis van scripts.
Het lost het probleem niet op om scripts op objectniveau in de juiste volgorde te krijgen, aangezien het objectmodel in de juiste volgorde moet worden gebouwd!
Aanpassen van bestaande databases
We kunnen in wezen dezelfde techniek gebruiken om een synchronisatiescript te bouwen dat alter een doeldatabase is op versie x en deze verandert in versie y, terwijl de bestaande gegevens behouden blijven, d.m.v. een migratie uit te voeren.
De vergelijkingstools hebben over het algemeen verschillende opties voor het uitsluiten of opnemen van verschillende soorten databaseobjecten (procedures, functies, tabellen, weergaven, enzovoort).
Sommige bieden ondersteuning voor gegevensvergelijkingen, waardoor nieuwe referentiegegevens (zoals winkellocaties of productcodes) mogelijk zijn. worden bijgewerkt in de doeldatabase.
Automatisch een database-build-script genereren op basis van objectscripts
Hoewel dit bouwproces afhankelijk is van de DDL-scripts op objectniveau in de VCS als de "bron van de waarheid", moet het team elk synchronisatiescript testen en archiveren dat is gebruikt om op deze manier een database op te bouwen, omdat het synchronisatiescript is een stap verwijderd van die 'waarheid'.
Herhaalbare builds realiseren
Elk build-script moet de nodige logica bevatten om ervoor te zorgen dat het idempotent is, wat betekent dat u het steeds opnieuw kunt uitvoeren en hetzelfde resultaat zal bereiken.
U zult waarschijnlijk verschillende soorten build-scripts horen die voornamelijk verschillen door het gebruik van 'bewakingsclausules' die voorkomen dat fouten de gegevens beschadigen.
De belangrijkste typen zijn de 'brute force', 'kill and fill' en 'idempotent' scripts.
Sommige build-systemen bieden 'transactionele' build-scripts als een optionele 'extra', dus we behandelen dit type script ook.
Het brute force-script
Het eenvoudigste build-script om de database objecten te bouwen, gaat uit van een lege database.
Het creëert elk object in een 'afhankelijkheids' volgorde die verwijzingen naar objecten die nog niet zijn gebouwd, voorkomt.
Als u het per ongeluk twee keer uitvoert, krijgt u een akelige lijst met fouten, maar er wordt geen schade aangericht.
Het kill and fill script
Iets ingewikkelder is de 'kill and fill'. Voordat het DDL-script wordt uitgevoerd om een object te bouwen, zoals een tabel, functie, procedure, weergave of wat dan ook, controleert het of het al bestaat, en als dit het geval is, wordt het verwijderd.
Hierdoor kunt u regelmatig een database opnieuw opbouwen op dezelfde server zonder dat u de lege database opnieuw hoeft te bouwen. Het heeft twee haken en ogen.
Ten eerste kan een onzorgvuldige of afgeleid DBA het per ongeluk uitvoeren op een live productieversie van de database en daardoor verschillende tabellen met gegevens vernietigen.
Ten tweede kun je een belangrijk deel van de build missen, namelijk het bouwen van de lege database met de juiste configuratie opties.
Het idempotent script
Met een idempotent script kunt u geen kwaad doen door het meer dan eens uit te voeren.
Als het een versie van de database vindt die er al is, controleert het de versie van de database en weigert het uit te voeren als het niet dezelfde versie is die het script bouwt.
Als het dezelfde versie is, worden alleen ontbrekende objecten gebouwd. Het probeert niets dat lijkt op een wijziging van een object.
Het transactionele script
Het transactiescript zal proberen om een deel of de hele database op te bouwen, en als er een fout optreedt, worden alle succesvolle bewerkingen teruggedraaid om de database te laten in de staat waarin deze zich bevond voordat het script werd uitgevoerd.
Het build-script verschilt van een migratie doordat, als een deel van een build mislukt, de hele operatie volledig moet worden 'afgebroken'.
Het terugdraaien van een component-script is niet nodig omdat de hele database toch wordt verwijderd.
Dit is echter niet van toepassing op server gebaseerde componenten of geplande taken die altijd beter kunnen worden uitgevoerd door een transactiescript.
Migraties moeten altijd transactiegericht zijn, anders blijft de database in een onbepaalde en mogelijk niet werkende staat achter.
Omgaan met gegevens
Vaak moet het buildproces alle noodzakelijke gegevens laden die nodig zijn om afhankelijke applicaties te laten functioneren en mogelijk om databasetests te ondersteunen.
Er zijn verschillende soorten, voornamelijk onveranderlijke, gegevens die we mogelijk moeten laden omdat dit nodig is om de database te laten functioneren, waaronder:
Dergelijke gegevens zijn de enige gegevens die onder versiebeheer zouden moeten worden gehouden.
Alle andere gegevens worden geladen in een post build script zoals gedicteerd door het manifest, tenzij de build plaatsvindt tegen een versie die al over de vereiste gegevens beschikt.
Testgegevens moeten worden gegenereerd met dezelfde distributie, kenmerken en datatype als de potentiële of feitelijke productiegegevens, en voor elk type test zijn waarschijnlijk verschillende testgegevenssets nodig.
Voor het testen van prestaties en schaalbaarheid is een reeks grote gegevenssets vereist, terwijl voor een integratietest waarschijnlijk standaard 'voor' en 'na' gegevensreeksen nodig zijn die alle waarschijnlijke uitschieters bevatten.
Testgegevens kunnen het beste worden geladen vanuit het 'native' BCP formaat met behulp van bulkload.
De vergelijkingstools hebben over het algemeen verschillende opties voor het uitsluiten of opnemen van verschillende soorten databaseobjecten (procedures, functies, tabellen, weergaven, enzovoort).
Sommige bieden ondersteuning voor gegevensvergelijkingen, waardoor nieuwe referentiegegevens (zoals winkellocaties of productcodes) mogelijk zijn. worden bijgewerkt in de doeldatabase.
Automatisch een database-build-script genereren op basis van objectscripts
Hoewel dit bouwproces afhankelijk is van de DDL-scripts op objectniveau in de VCS als de "bron van de waarheid", moet het team elk synchronisatiescript testen en archiveren dat is gebruikt om op deze manier een database op te bouwen, omdat het synchronisatiescript is een stap verwijderd van die 'waarheid'.
Herhaalbare builds realiseren
Elk build-script moet de nodige logica bevatten om ervoor te zorgen dat het idempotent is, wat betekent dat u het steeds opnieuw kunt uitvoeren en hetzelfde resultaat zal bereiken.
U zult waarschijnlijk verschillende soorten build-scripts horen die voornamelijk verschillen door het gebruik van 'bewakingsclausules' die voorkomen dat fouten de gegevens beschadigen.
De belangrijkste typen zijn de 'brute force', 'kill and fill' en 'idempotent' scripts.
Sommige build-systemen bieden 'transactionele' build-scripts als een optionele 'extra', dus we behandelen dit type script ook.
Het brute force-script
Het eenvoudigste build-script om de database objecten te bouwen, gaat uit van een lege database.
Het creëert elk object in een 'afhankelijkheids' volgorde die verwijzingen naar objecten die nog niet zijn gebouwd, voorkomt.
Als u het per ongeluk twee keer uitvoert, krijgt u een akelige lijst met fouten, maar er wordt geen schade aangericht.
Het kill and fill script
Iets ingewikkelder is de 'kill and fill'. Voordat het DDL-script wordt uitgevoerd om een object te bouwen, zoals een tabel, functie, procedure, weergave of wat dan ook, controleert het of het al bestaat, en als dit het geval is, wordt het verwijderd.
Hierdoor kunt u regelmatig een database opnieuw opbouwen op dezelfde server zonder dat u de lege database opnieuw hoeft te bouwen. Het heeft twee haken en ogen.
Ten eerste kan een onzorgvuldige of afgeleid DBA het per ongeluk uitvoeren op een live productieversie van de database en daardoor verschillende tabellen met gegevens vernietigen.
Ten tweede kun je een belangrijk deel van de build missen, namelijk het bouwen van de lege database met de juiste configuratie opties.
Het idempotent script
Met een idempotent script kunt u geen kwaad doen door het meer dan eens uit te voeren.
Als het een versie van de database vindt die er al is, controleert het de versie van de database en weigert het uit te voeren als het niet dezelfde versie is die het script bouwt.
Als het dezelfde versie is, worden alleen ontbrekende objecten gebouwd. Het probeert niets dat lijkt op een wijziging van een object.
Het transactionele script
Het transactiescript zal proberen om een deel of de hele database op te bouwen, en als er een fout optreedt, worden alle succesvolle bewerkingen teruggedraaid om de database te laten in de staat waarin deze zich bevond voordat het script werd uitgevoerd.
Het build-script verschilt van een migratie doordat, als een deel van een build mislukt, de hele operatie volledig moet worden 'afgebroken'.
Het terugdraaien van een component-script is niet nodig omdat de hele database toch wordt verwijderd.
Dit is echter niet van toepassing op server gebaseerde componenten of geplande taken die altijd beter kunnen worden uitgevoerd door een transactiescript.
Migraties moeten altijd transactiegericht zijn, anders blijft de database in een onbepaalde en mogelijk niet werkende staat achter.
Omgaan met gegevens
Vaak moet het buildproces alle noodzakelijke gegevens laden die nodig zijn om afhankelijke applicaties te laten functioneren en mogelijk om databasetests te ondersteunen.
Er zijn verschillende soorten, voornamelijk onveranderlijke, gegevens die we mogelijk moeten laden omdat dit nodig is om de database te laten functioneren, waaronder:
- Referentiegegevens - gegevens die verwijzen naar relatief onveranderlijke gegevens, zoals informatie over landen, valuta's of metingen.
- Statische gegevens - meestal een synoniem voor referentiegegevens.
- Opsommingen - korte, smalle tabellen die sets van onveranderlijke entiteiten vertegenwoordigen.
- Seed-gegevens - gegevens die nodig zijn om een hiërarchische tabel te initialiseren met de wortel van de hiërarchie.
- Domeingegevens - gegevens die het bedrijfsdomein definiëren en die tijdens de levensduur van deze versie van de database niet zullen veranderen.
- Error verklaringen voor 'bedrijf' of 'domein' fouten - zoals voor slechte data in ETL banen of falende bedrijfsprocessen.
Dergelijke gegevens zijn de enige gegevens die onder versiebeheer zouden moeten worden gehouden.
Alle andere gegevens worden geladen in een post build script zoals gedicteerd door het manifest, tenzij de build plaatsvindt tegen een versie die al over de vereiste gegevens beschikt.
Testgegevens moeten worden gegenereerd met dezelfde distributie, kenmerken en datatype als de potentiële of feitelijke productiegegevens, en voor elk type test zijn waarschijnlijk verschillende testgegevenssets nodig.
Voor het testen van prestaties en schaalbaarheid is een reeks grote gegevenssets vereist, terwijl voor een integratietest waarschijnlijk standaard 'voor' en 'na' gegevensreeksen nodig zijn die alle waarschijnlijke uitschieters bevatten.
Testgegevens kunnen het beste worden geladen vanuit het 'native' BCP formaat met behulp van bulkload.
Pre- en post build processen
Een bouwproces omvat over het algemeen pre-build en post-build-processen.
Diverse geautomatiseerde of semi-geautomatiseerde processen zijn vaak opgenomen in de build, maar bouwen logischerwijs geen deel uit van de build.
Daarom worden ze in een of andere van twee fasen van de build ingevoegd, het 'pre-buildproces' en de 'post-build'. werkwijze'.
Een build-systeem zal voor en na de build slots hebben om deze op te vangen.
Dit zijn waarschijnlijk SQL- of PowerShell scripts.
Een belangrijk voorbouwproces is bijvoorbeeld 'het voorbereiden van de werkruimte', wat inhoudt dat aan alle noodzakelijke vereisten voor de bouw is voldaan.
Wat dit inhoudt, is erg afhankelijk van de aard van de database die wordt gebouwd.
Het kan ook het voorbereiden van een virtuele machine zijn waarop SQL Server in de juiste versie is geïnstalleerd, of het controleren of het platform correct is geconfigureerd en of er voldoende schijfruimte is.
Typische post-build-processen zijn onder meer de processen die zijn ontworpen om teamgebaseerde workflow of rapportage te beheren.
We moeten bijvoorbeeld de tijd van de build, de versie die wordt gebouwd en het succes van de build, samen met waarschuwingsberichten registreren.
Het kan gaan om e-mailwaarschuwingen en kan zelfs aangeven wat er in de build is veranderd sinds de laatste succesvolle build.
Er moet natuurlijk ook een stap na het bouwen zijn om de build te valideren.
Speciaal bedachte tests zullen niet alleen controleren of de build succesvol was, maar dat geen enkel belangrijk onderdeel van het systeem volledig kapot is.
Het promoten van builds via de omgevingen
Idealiter zou u geen ander bouwproces moeten hebben voor ontwikkeling, test, integratie, release en implementatie.
Ons doel is dat de build volledig geautomatiseerd is en dat het build-pakket dat we produceren en vervolgens testen, zal worden gebruikt om de database te bouwen, bij die versie, voor alle omgevingen, van ontwikkeling via QA en Staging tot productie.
Om geautomatiseerde, consistente builds in alle omgevingen te realiseren, 'is het het beste als de ontwikkelomgeving de productieomgeving zo goed mogelijk nabootst wat betreft de architectuur van de database en objecten, en in de omringende databasetechnologieën.
Dit is niet altijd mogelijk.
Enterprise-databases zullen waarschijnlijk functies gebruiken zoals gepartitioneerde tabellen, ColumnStore indexen en vele andere Enterprise-functies, die niet gemakkelijk kunnen worden nagebootst in de ontwikkelomgeving.
Bovendien kunnen er noodherstel, hoge beschikbaarheid of controlefuncties zijn, zoals replicatie of het vastleggen van wijzigingsgegevens, die niet geschikt zijn in de ontwikkelomgeving.
DLM moedigt teams aan om nauw samen te werken, waardoor het gemakkelijker wordt om 'hooks' in de build te voorzien om aspecten van de build in elke serveromgeving anders te laten zijn.
Bijvoorbeeld om de juiste log-ins te koppelen aan elke server- en databaserol, in elke omgeving, of om het juiste controle regime te bieden. Wilt u een database laten bouwen? Contact ons direct.
Diverse geautomatiseerde of semi-geautomatiseerde processen zijn vaak opgenomen in de build, maar bouwen logischerwijs geen deel uit van de build.
Daarom worden ze in een of andere van twee fasen van de build ingevoegd, het 'pre-buildproces' en de 'post-build'. werkwijze'.
Een build-systeem zal voor en na de build slots hebben om deze op te vangen.
Dit zijn waarschijnlijk SQL- of PowerShell scripts.
Een belangrijk voorbouwproces is bijvoorbeeld 'het voorbereiden van de werkruimte', wat inhoudt dat aan alle noodzakelijke vereisten voor de bouw is voldaan.
Wat dit inhoudt, is erg afhankelijk van de aard van de database die wordt gebouwd.
Het kan ook het voorbereiden van een virtuele machine zijn waarop SQL Server in de juiste versie is geïnstalleerd, of het controleren of het platform correct is geconfigureerd en of er voldoende schijfruimte is.
Typische post-build-processen zijn onder meer de processen die zijn ontworpen om teamgebaseerde workflow of rapportage te beheren.
We moeten bijvoorbeeld de tijd van de build, de versie die wordt gebouwd en het succes van de build, samen met waarschuwingsberichten registreren.
Het kan gaan om e-mailwaarschuwingen en kan zelfs aangeven wat er in de build is veranderd sinds de laatste succesvolle build.
Er moet natuurlijk ook een stap na het bouwen zijn om de build te valideren.
Speciaal bedachte tests zullen niet alleen controleren of de build succesvol was, maar dat geen enkel belangrijk onderdeel van het systeem volledig kapot is.
Het promoten van builds via de omgevingen
Idealiter zou u geen ander bouwproces moeten hebben voor ontwikkeling, test, integratie, release en implementatie.
Ons doel is dat de build volledig geautomatiseerd is en dat het build-pakket dat we produceren en vervolgens testen, zal worden gebruikt om de database te bouwen, bij die versie, voor alle omgevingen, van ontwikkeling via QA en Staging tot productie.
Om geautomatiseerde, consistente builds in alle omgevingen te realiseren, 'is het het beste als de ontwikkelomgeving de productieomgeving zo goed mogelijk nabootst wat betreft de architectuur van de database en objecten, en in de omringende databasetechnologieën.
Dit is niet altijd mogelijk.
Enterprise-databases zullen waarschijnlijk functies gebruiken zoals gepartitioneerde tabellen, ColumnStore indexen en vele andere Enterprise-functies, die niet gemakkelijk kunnen worden nagebootst in de ontwikkelomgeving.
Bovendien kunnen er noodherstel, hoge beschikbaarheid of controlefuncties zijn, zoals replicatie of het vastleggen van wijzigingsgegevens, die niet geschikt zijn in de ontwikkelomgeving.
DLM moedigt teams aan om nauw samen te werken, waardoor het gemakkelijker wordt om 'hooks' in de build te voorzien om aspecten van de build in elke serveromgeving anders te laten zijn.
Bijvoorbeeld om de juiste log-ins te koppelen aan elke server- en databaserol, in elke omgeving, of om het juiste controle regime te bieden. Wilt u een database laten bouwen? Contact ons direct.
Bouw in de ontwikkelomgeving van de database
Om consistentie in het bouwen in verschillende omgevingen te bereiken, moeten alle DLM oplossingen voor het opbouwproces van een database een hoge mate van vrijheid bieden voor wat wel of niet is opgenomen in het bouwproces.
Een bouwproces binnen ontwikkeling zal over het algemeen alleen lokale bronnen gebruiken.
Een DLM-build is zo flexibel ontworpen dat externe afhankelijkheden zoals ETL-processen en downstream BI kunnen worden 'bespot', door interface-compatibele stubs te bouwen, om het scala aan tests dat kan worden uitgevoerd te vergroten en de ontwikkeling onafhankelijk te laten verlopen.
Dit betekent dat upstream ETL-processen voldoende worden 'bespot' om te worden getest.
Geallieerde databases, middleware-services en berichtenwachtrijen zullen ofwel skeletachtig zijn of bespot.
Evenzo worden 'downstream'-processen die' klanten 'zijn van de gegevens uit de database doorgaans ook' bespot '.
Een ontwikkelbouwproces heeft ook een beveiligings- en toegangscontrolesysteem (bijv. GRANTS en gebruikersaccounts) waarmee de ontwikkelaars volledige toegang hebben.
Als het op rollen is gebaseerd, kan de productietoegangscontrole eenvoudig worden gebruikt voor een productieopbouw tijdens het implementatieproces.
Het toewijzen van datarollen
Doorgaans zullen operaties gebruikers willen toewijzen via active directory, dus de productie-build zal een andere set Windows-groepen hebben die zijn gemaakt als databasegebruikers, en databaserollen toegewezen krijgen zoals dat past bij het beveiligingsmodel voor de database.
Een stap in de richting van het doel van consistente builds is ervoor te zorgen dat alle noodzakelijke aanpassingen aan het buildproces, voor de verschillende omgevingen, in het manifest moeten worden opgenomen in plaats van in het scriptproces zelf.
Al deze manifesten kunnen worden opgeslagen in ontwikkelbronbeheer of op de centrale beheerserver.
In wezen hebben we een duidelijke scheiding nodig tussen de gegevens en de eigenschappen van de databaseconfiguratie.
We kunnen sjablonen gebruiken om het hoofd te bieden aan uitdagingen zoals verwijzingen naar:
Deze zouden resulteren in verschillende waarde voor elke omgeving.
We kunnen aparte configuratiebestanden leveren, getest door uw CI processen als onderdeel van het database release-pakket.
Zo kunnen we:
Een bouwproces binnen ontwikkeling zal over het algemeen alleen lokale bronnen gebruiken.
Een DLM-build is zo flexibel ontworpen dat externe afhankelijkheden zoals ETL-processen en downstream BI kunnen worden 'bespot', door interface-compatibele stubs te bouwen, om het scala aan tests dat kan worden uitgevoerd te vergroten en de ontwikkeling onafhankelijk te laten verlopen.
Dit betekent dat upstream ETL-processen voldoende worden 'bespot' om te worden getest.
Geallieerde databases, middleware-services en berichtenwachtrijen zullen ofwel skeletachtig zijn of bespot.
Evenzo worden 'downstream'-processen die' klanten 'zijn van de gegevens uit de database doorgaans ook' bespot '.
Een ontwikkelbouwproces heeft ook een beveiligings- en toegangscontrolesysteem (bijv. GRANTS en gebruikersaccounts) waarmee de ontwikkelaars volledige toegang hebben.
Als het op rollen is gebaseerd, kan de productietoegangscontrole eenvoudig worden gebruikt voor een productieopbouw tijdens het implementatieproces.
Het toewijzen van datarollen
Doorgaans zullen operaties gebruikers willen toewijzen via active directory, dus de productie-build zal een andere set Windows-groepen hebben die zijn gemaakt als databasegebruikers, en databaserollen toegewezen krijgen zoals dat past bij het beveiligingsmodel voor de database.
Een stap in de richting van het doel van consistente builds is ervoor te zorgen dat alle noodzakelijke aanpassingen aan het buildproces, voor de verschillende omgevingen, in het manifest moeten worden opgenomen in plaats van in het scriptproces zelf.
Al deze manifesten kunnen worden opgeslagen in ontwikkelbronbeheer of op de centrale beheerserver.
In wezen hebben we een duidelijke scheiding nodig tussen de gegevens en de eigenschappen van de databaseconfiguratie.
We kunnen sjablonen gebruiken om het hoofd te bieden aan uitdagingen zoals verwijzingen naar:
- Externe systemen
- Gekoppelde databases
- Bestandspaden
- Logbestandspaden
- Plaatsing op een partitieschema en het pad naar volledige-tekst indexbestanden
- Bestands groep plaatsingen of bestandsgroottes.
Deze zouden resulteren in verschillende waarde voor elke omgeving.
We kunnen aparte configuratiebestanden leveren, getest door uw CI processen als onderdeel van het database release-pakket.
Zo kunnen we:
- Specificeer omgeving specifieke parameters in omgevingsconfiguratiebestanden - zoals de locatie van de databasebestanden, hun grootte, groeisnelheden enzovoort.
- Verwijder alle omgeving specifieke instructies uit de build- en migratiescripts - een wijziging van de configuratie mag geen code- of scriptwijziging met zich meebrengen.
- Zorg ervoor dat de beveiligingsconfiguratie gemakkelijk te onderhouden is - beveiligingsinstellingen (log-in, rollen, machtigingen voor databaseobjecten) horen thuis in configuratiebestanden, niet in T-SQL-scripts
Database bouwen in QA, Staging en Productie
Om een database correct te laten werken, moet de canonieke bron, in de VCS, ook componenten bevatten die op de server worden uitgevoerd, in plaats van in de database, wanneer het tijd is om in productie te gaan of in productie-achtige omgevingen.
Deze server objecten zijn onder andere geplande taken, waarschuwingen en instellingen servers.
U hebt ook scripts nodig om de interface te definiëren die het toegangscontrolesysteem van de database (databasegebruikers en rollen) koppelt aan de door de server gedefinieerde aanmeldingen, groepen en gebruikers, zodat de juiste gebruikers toegang hebben tot de rollen die in de database zijn gedefinieerd.
Als een build slaagt en wordt gevalideerd, betekent dit dat alle DDL broncode, assemblages, gekoppelde servers, interfaces, ETL-taken, geplande taken en andere componenten die bij een database zijn betrokken, in de juiste volgorde zijn geïdentificeerd en gebruikt.
Dit maakt het moeilijker voor een volgende implementatie om te mislukken als gevolg van een ontbrekend onderdeel, en alle mensen die betrokken zijn bij de levenscyclus van de database kunnen in elk stadium zien welke onderdelen worden gebruikt.
Deze server objecten zijn onder andere geplande taken, waarschuwingen en instellingen servers.
U hebt ook scripts nodig om de interface te definiëren die het toegangscontrolesysteem van de database (databasegebruikers en rollen) koppelt aan de door de server gedefinieerde aanmeldingen, groepen en gebruikers, zodat de juiste gebruikers toegang hebben tot de rollen die in de database zijn gedefinieerd.
Als een build slaagt en wordt gevalideerd, betekent dit dat alle DDL broncode, assemblages, gekoppelde servers, interfaces, ETL-taken, geplande taken en andere componenten die bij een database zijn betrokken, in de juiste volgorde zijn geïdentificeerd en gebruikt.
Dit maakt het moeilijker voor een volgende implementatie om te mislukken als gevolg van een ontbrekend onderdeel, en alle mensen die betrokken zijn bij de levenscyclus van de database kunnen in elk stadium zien welke onderdelen worden gebruikt.
De kenmerken van een DLM databaseopbouw
Als het database ontwikkelingsteam de discipline niet afdwingt om altijd te beginnen met een bekende versie in bronbeheer en regelmatig te testen om te bewijzen dat ze de vereiste versie van de database kunnen bouwen, dan lijdt u waarschijnlijk aan een onbetrouwbare en tijdrovende het onderdrukken van het databaseopbouwproces.
Een vrij typische niet DLM benadering gaat ongeveer als volgt.
Het ontwikkelteam brengt wijzigingen aan in een gedeelde database, hetzij rechtstreeks, hetzij met behulp van een databasebeheerder (DBA) of een databaseontwikkelaar.
Als het tijd is om een nieuwe versie van de applicatie uit te brengen, werkt het database bouwteam samen met de DBA om een lijst te bouwen met alleen de databasewijzigingen die nodig zijn om de nieuwe versie te ondersteunen.
Testomgeving database
Ze genereren een set scripts, voeren deze uit tegen de database in de testomgeving (hoewel dit in het ergste geval rechtstreeks tegen een productieomgeving gebeurt) en bouwen vervolgens de database.
Uit testen blijkt dat sommige van de noodzakelijke wijzigingen in de database er niet zijn, dus worden er extra scripts gegenereerd en uitgevoerd.
Vervolgens ontdekken ze dat er scripts zijn uitgevoerd die databasewijzigingen implementeren die de applicatie nog niet kan ondersteunen. Ze genereren nog een set scripts om de ongewenste wijzigingen ongedaan te bouwen.
Dit chaotische proces gaat door totdat, meer door doorzettingsvermogen dan door planning, de applicatie werkt.
Het team heeft nu een hele nieuwe set scripts die handmatig zijn gemaakt en die in de juiste volgorde moeten worden uitgevoerd om in de volgende omgeving te kunnen worden geïmplementeerd.
Dit veroorzaakt allerlei problemen.
Ontwikkeling en testen worden vertraagd door alle extra tijd die nodig is om de benodigde wijzigingen te identificeren.
Het handmatige proces van het genereren van scripts is tijdrovend en zeer foutgevoelig.
Het leidt tot vertraagde functionaliteit en vaak tot bugs en prestatieproblemen.
In het ergste geval kan dit leiden tot het introduceren van fouten in de gegevens of zelfs tot verlies van gegevens.
Om dit soort pijn te voorkomen, moeten database-builds (en migraties) worden geautomatiseerd, gecontroleerd, herhaalbaar, meetbaar en zichtbaar.
Een vrij typische niet DLM benadering gaat ongeveer als volgt.
Het ontwikkelteam brengt wijzigingen aan in een gedeelde database, hetzij rechtstreeks, hetzij met behulp van een databasebeheerder (DBA) of een databaseontwikkelaar.
Als het tijd is om een nieuwe versie van de applicatie uit te brengen, werkt het database bouwteam samen met de DBA om een lijst te bouwen met alleen de databasewijzigingen die nodig zijn om de nieuwe versie te ondersteunen.
Testomgeving database
Ze genereren een set scripts, voeren deze uit tegen de database in de testomgeving (hoewel dit in het ergste geval rechtstreeks tegen een productieomgeving gebeurt) en bouwen vervolgens de database.
Uit testen blijkt dat sommige van de noodzakelijke wijzigingen in de database er niet zijn, dus worden er extra scripts gegenereerd en uitgevoerd.
Vervolgens ontdekken ze dat er scripts zijn uitgevoerd die databasewijzigingen implementeren die de applicatie nog niet kan ondersteunen. Ze genereren nog een set scripts om de ongewenste wijzigingen ongedaan te bouwen.
Dit chaotische proces gaat door totdat, meer door doorzettingsvermogen dan door planning, de applicatie werkt.
Het team heeft nu een hele nieuwe set scripts die handmatig zijn gemaakt en die in de juiste volgorde moeten worden uitgevoerd om in de volgende omgeving te kunnen worden geïmplementeerd.
Dit veroorzaakt allerlei problemen.
Ontwikkeling en testen worden vertraagd door alle extra tijd die nodig is om de benodigde wijzigingen te identificeren.
Het handmatige proces van het genereren van scripts is tijdrovend en zeer foutgevoelig.
Het leidt tot vertraagde functionaliteit en vaak tot bugs en prestatieproblemen.
In het ergste geval kan dit leiden tot het introduceren van fouten in de gegevens of zelfs tot verlies van gegevens.
Om dit soort pijn te voorkomen, moeten database-builds (en migraties) worden geautomatiseerd, gecontroleerd, herhaalbaar, meetbaar en zichtbaar.
DLM database builds zijn geautomatiseerd
Zoals eerder beschreven, moet u, om een database te bouwen met scripts met een aantal verschillende objecten erin, een 'manifest'-bestand bouwen en vervolgens onderhouden met een lijst van de bestanden in de volgorde van uitvoering/
Of u zou een tool zoals SQL Compare moeten gebruiken die een directory met scripts kan lezen alsof het een database is.
Als u een manifest gebruikt, houdt u dat in bronbeheer met de scripts.
Label en vertak het manifest met de scripts
Als u een differentiële tool gebruikt, zoals SQL Compare, slaat u het gegenereerde build-script op in bronbeheer met het juiste label of de juiste vertakking.
Een groot deel van automatisering is de mogelijkheid om zowel te repliceren wat je hebt gedaan als terug te gaan en te bekijken wat je hebt gedaan. Als u het manifest of de gegenereerde scripts onder bronbeheer houdt, kunt u dit altijd doen.
Hoewel een build tool of een propriëtaire build server vaak wordt gebruikt om het bouwen van databases te automatiseren, is dit niet nodig.
U hebt alleen een script nodig dat elk script serieel op volgorde uitvoert, en SQLCMD.exe kan eenvoudig worden gebruikt om een SQL bestand op een doelserver uit te voeren.
Als je een gedeelde bouwserver gebruikt met daarin de ontwikkeldatabase, en deze wordt volledig up-to-date gehouden met versiebeheer (al het huidige werk wordt ingecheckt).
Dan kun je de bouwvolgorde berekenen met een SQL routine die een topologische soort afhankelijkheden tussen objecten om eerst de objecten op te sommen die geen afhankelijkheden hebben en vervolgens achtereenvolgens alle objecten die alleen afhankelijk zijn van reeds vermelde objecten totdat alle objecten zijn verantwoord.
U kunt natuurlijk een PowerShell routine bouwen die SMO aanroept om de taak voor u uit te voeren.
Als al het andere niet lukt, kunt u SSMS gebruiken om een volledig build-script voor u te genereren vanuit de ontwikkelingsdatabase.
Dit alleen om de volgorde te gebruiken waarin de objecten zijn gemaakt om de volgorde voor uw manifest te bepalen.
Of u zou een tool zoals SQL Compare moeten gebruiken die een directory met scripts kan lezen alsof het een database is.
Als u een manifest gebruikt, houdt u dat in bronbeheer met de scripts.
Label en vertak het manifest met de scripts
Als u een differentiële tool gebruikt, zoals SQL Compare, slaat u het gegenereerde build-script op in bronbeheer met het juiste label of de juiste vertakking.
Een groot deel van automatisering is de mogelijkheid om zowel te repliceren wat je hebt gedaan als terug te gaan en te bekijken wat je hebt gedaan. Als u het manifest of de gegenereerde scripts onder bronbeheer houdt, kunt u dit altijd doen.
Hoewel een build tool of een propriëtaire build server vaak wordt gebruikt om het bouwen van databases te automatiseren, is dit niet nodig.
U hebt alleen een script nodig dat elk script serieel op volgorde uitvoert, en SQLCMD.exe kan eenvoudig worden gebruikt om een SQL bestand op een doelserver uit te voeren.
Als je een gedeelde bouwserver gebruikt met daarin de ontwikkeldatabase, en deze wordt volledig up-to-date gehouden met versiebeheer (al het huidige werk wordt ingecheckt).
Dan kun je de bouwvolgorde berekenen met een SQL routine die een topologische soort afhankelijkheden tussen objecten om eerst de objecten op te sommen die geen afhankelijkheden hebben en vervolgens achtereenvolgens alle objecten die alleen afhankelijk zijn van reeds vermelde objecten totdat alle objecten zijn verantwoord.
U kunt natuurlijk een PowerShell routine bouwen die SMO aanroept om de taak voor u uit te voeren.
Als al het andere niet lukt, kunt u SSMS gebruiken om een volledig build-script voor u te genereren vanuit de ontwikkelingsdatabase.
Dit alleen om de volgorde te gebruiken waarin de objecten zijn gemaakt om de volgorde voor uw manifest te bepalen.
DLM database builds komen vaak voor
Tijdens de ontwikkeling moet het bouwproces regelmatig worden gedaan, omdat het u vertelt of het mogelijk is om dit te doen met de nieuwste versie van de gecommitteerde code, en u het hele team up-to-date kunt houden.
De canonieke database die het resultaat is van een succesvolle build, kan ook worden vergeleken met andere ontwikkelingsversies om er zeker van te zijn dat ze up-to-date zijn, en kan worden gebruikt voor een verscheidenheid aan routinematige integratie- en prestatietests.
Regelmatige of 's nachts builds kunnen problemen in een vroeg stadium opmerken.
Een build kan dagelijks worden gepland, nadat alle wijzigingen van de ontwikkelaars zijn gecommitteerd en indien nodig zijn samengevoegd, of na elke belangrijke commit, wanneer onderdelen van componenten veranderen.
Er wordt getest op de meest recente build om deze te valideren.
Gewoonlijk worden builds gedaan naar de nieuwste versie, maar met versiebeheer kunnen af en toe ad-hoc builds worden gedaan wanneer dat nodig is op eerdere versies van de code om fouten op te sporen of om werk dat later werd verwijderd, nieuw leven in te blazen.
DLM-database builds zijn herhaalbaar
Zoals eerder beschreven, zouden we in staat moeten zijn om hetzelfde script keer op keer uit te voeren op elk systeem en het zal nooit breken omdat het eerder was uitgevoerd.
Een DLM-buildproces mag nooit resulteren in een "gedeeltelijke" build. Als het op enig moment mislukt, moet het alle wijzigingen terugdraaien naar de startversie.
Dit vereist het omwikkelen van de build in een transactie die bij fout terugdraait.
Als een build met succes is geautomatiseerd, is de kans veel groter dat deze op precies dezelfde manier kan worden herhaald, met minimale tussenkomst van de operator.
Het bestuursproces zal meer vertrouwen hebben in de tijd die moet worden uitgetrokken voor een bouwproces en validatie, en zal veel meer vertrouwen hebben in een succesvol resultaat.
Dit maakt het gehele end-to-end leveringsproces voorspelbaarder.
DLM-database-builds worden getest
We moeten natuurlijk niet alleen valideren dat de build of migratie is geslaagd, maar ook dat de database precies is gebouwd zoals bedoeld. Zijn uw database en statische gegevens intact?
Werken alle onderdelen van uw applicatie en belangrijke code nog zoals verwacht?
Zijn alle databaseobjecten aanwezig en correct?
Door geautomatiseerde tests in uw buildproces op te nemen, voegt u extra beveiligingen toe die ervoor zorgen dat u uiteindelijk code van hogere kwaliteit implementeert die veel minder fouten bevat.
We gaan uitgebreid in op testen in het artikel Database testen.
De canonieke database die het resultaat is van een succesvolle build, kan ook worden vergeleken met andere ontwikkelingsversies om er zeker van te zijn dat ze up-to-date zijn, en kan worden gebruikt voor een verscheidenheid aan routinematige integratie- en prestatietests.
Regelmatige of 's nachts builds kunnen problemen in een vroeg stadium opmerken.
Een build kan dagelijks worden gepland, nadat alle wijzigingen van de ontwikkelaars zijn gecommitteerd en indien nodig zijn samengevoegd, of na elke belangrijke commit, wanneer onderdelen van componenten veranderen.
Er wordt getest op de meest recente build om deze te valideren.
Gewoonlijk worden builds gedaan naar de nieuwste versie, maar met versiebeheer kunnen af en toe ad-hoc builds worden gedaan wanneer dat nodig is op eerdere versies van de code om fouten op te sporen of om werk dat later werd verwijderd, nieuw leven in te blazen.
DLM-database builds zijn herhaalbaar
Zoals eerder beschreven, zouden we in staat moeten zijn om hetzelfde script keer op keer uit te voeren op elk systeem en het zal nooit breken omdat het eerder was uitgevoerd.
Een DLM-buildproces mag nooit resulteren in een "gedeeltelijke" build. Als het op enig moment mislukt, moet het alle wijzigingen terugdraaien naar de startversie.
Dit vereist het omwikkelen van de build in een transactie die bij fout terugdraait.
Als een build met succes is geautomatiseerd, is de kans veel groter dat deze op precies dezelfde manier kan worden herhaald, met minimale tussenkomst van de operator.
Het bestuursproces zal meer vertrouwen hebben in de tijd die moet worden uitgetrokken voor een bouwproces en validatie, en zal veel meer vertrouwen hebben in een succesvol resultaat.
Dit maakt het gehele end-to-end leveringsproces voorspelbaarder.
DLM-database-builds worden getest
We moeten natuurlijk niet alleen valideren dat de build of migratie is geslaagd, maar ook dat de database precies is gebouwd zoals bedoeld. Zijn uw database en statische gegevens intact?
Werken alle onderdelen van uw applicatie en belangrijke code nog zoals verwacht?
Zijn alle databaseobjecten aanwezig en correct?
Door geautomatiseerde tests in uw buildproces op te nemen, voegt u extra beveiligingen toe die ervoor zorgen dat u uiteindelijk code van hogere kwaliteit implementeert die veel minder fouten bevat.
We gaan uitgebreid in op testen in het artikel Database testen.
DLM database builds zijn meetbaar en zichtbaar
Een geautomatiseerde build kan uitgebreider zijn en niet alleen de database bouwen, maar ook automatisch gegenereerde build-aantekeningen en andere documentatie zoals helppagina's.
Het is gemakkelijker om te rapporteren over een geautomatiseerde build, en naast eenvoudige feiten zoals de tijd die het kostte en of het lukte, het aantal waarschuwingen en zelfs een algehele codekwaliteitsstatistiek, of codebeleid, indien nodig.
Dit stelt het bestuursproces in staat om zijn audit- en verantwoordingstaken uit te voeren en de planning van schattingen vast te stellen.
Elk build- en versiebeheersysteem moet ontwikkelaars, maar ook mensen buiten het ontwikkelteam, in staat stellen te zien wat er verandert en waarom, zonder dat er tijdrovende vergaderingen en formele processen nodig zijn.
Overwegingen bij het bouwen van geavanceerde databases
Er lijkt een oneindige verscheidenheid aan databases te zijn en dit komt tot uiting in het aantal opties waarmee rekening moet worden gehouden bij het bouwen en het daaropvolgende implementatieproces.
Er zijn veel keuzes te bouwen over hoe de build wordt verwerkt in het geval van verschillende eventualiteiten. Hier zijn er slechts enkele van.
Is de serverversie (platform) compatibel met de databasecode?
Verschillende versies en edities van het RDBMS hebben verschillende mogelijkheden.
Het is gemakkelijk om werkende code te produceren voor één versie van SQL Server die volledig zal falen, op een subtiel andere manier zal werken, of met verminderde prestaties, op een andere versie.
Een database is altijd gecodeerd voor een bepaalde versie van het RDBMS.
Als de databasespecificatie het compatibiliteitsniveau van de database bevat, of het bereik van versies waarop het moet draaien, dan moet het build-script een bewakingsclausule bevatten om de compatibiliteit en versie van de host SQL Server waarop de database wordt geïnstalleerd te controleren, en mislukt de build als deze onjuist is.
Is de standaardsortering van de database de juiste?
Een sortering heeft invloed op de manier waarop een database zich gedraagt.
Soms is het effect opmerkelijk, zoals wanneer u overschakelt van een hoofdlettergevoelige sortering naar een niet hoofdlettergevoelige sortering of omgekeerd.
Het heeft ook invloed op de manier waarop gegevens worden gesorteerd of de manier waarop jokertekenuitdrukkingen worden geëvalueerd.
Dit zal subtiele bugs produceren die lang kunnen duren om op te merken en te corrigeren.
Het build-script moet, om veilig te zijn, de database-sortering controleren en een fout veroorzaken als deze onjuist is.
Kunnen eigenschappen op databaseniveau tijdens de build worden gewijzigd?
Code die werkt onder één databaseconfiguratie, kan eenvoudig worden gestopt door een configuratie-item op databaseniveau te wijzigen.
Wanneer een server een database maakt, gebruikt deze de configuratie op modeldatabaseniveau die in de database is ingesteld.
Dit kan heel anders zijn dan de databaseconfiguratie op de servers van de ontwikkelaars, en als deze verschillen worden toegestaan, zal het resultaat grote schade aanrichten.
Het build-script moet controleren of de database de juiste configuratie heeft voor zaken als het standaard isolatieniveau, datumnotatie, taal, ANSI null waarden.
Moet de database die wordt gebouwd, dan als een bepaalde versie op de server worden geregistreerd?
Met SQL Server kunnen databases worden geregistreerd wanneer ze worden gebouwd of gewijzigd, wat betekent dat een XML-momentopname van de metagegevens van een database wordt opgeslagen op de server en kan worden gebruikt om te controleren of er achteraf geen ongeautoriseerde wijzigingen zijn aangebracht.
Het is over het algemeen een goede voorzorgsmaatregel om een database te registreren als u DacFx gebruikt, maar zeer grote databases kunnen mogelijk aanzienlijke ruimte in beslag nemen.
Moeten alle beperkingen worden gecontroleerd nadat alle gegevens in de build zijn ingevoegd?
Dit is alleen van toepassing als er een soort statische gegevens in de database worden geïmporteerd als onderdeel van de build.
Om een snelle gegevensimport te garanderen, worden beperkingen tijdens het importeren uitgeschakeld en vervolgens opnieuw ingeschakeld nadat de taak is voltooid.
Door de beperkingen opnieuw in te schakelen, worden alle gegevens in één keer achteraf gecontroleerd.
Dit is de beste tijd om dit te doen, maar het kan zijn dat er later meer gegevens in een gerelateerde tabel moeten worden ingevoegd, en daarom moet dit misschien worden uitgesteld.
Moet de build verschillen in bestandspaden, kolomsortering en andere instellingen toestaan?
Veel paden en database- of serverinstellingen kunnen per serveromgeving verschillen.
Er zullen bijvoorbeeld waarschijnlijk verschillende bestandspaden zijn voor gegevens- en logbestanden, misschien verschillende bestands groep plaatsingen, een ander pad naar volledige-tekst indexbestanden of voor een cryptografische provider.
Sommige instellingen, zoals bestandspaden, logbestandspaden, plaatsing op een partitieschema, het pad naar full-text indexbestanden, bestands groep plaatsingen of bestandsgroottes, hebben niets te bouwen met ontwikkeling en veel met bewerkingen en serverbeheer.
Ze zijn afhankelijk van de manier waarop de server is geconfigureerd.
Men kan stellen dat hetzelfde geldt voor FillFactor.
Er zijn gevaren verbonden aan het overschrijven van zaken als het zaad of de toename van identiteitskolommen of sortering.
Deze instellingen moeten in een afzonderlijk build script voor elke serveromgeving staan of worden afgehandeld door SQLCMD variabelen die tijdens de uitvoering worden ingesteld.
Hoe moet de build omgaan met verschillende beveiligingsopties tussen serveromgevingen?
Hoe moet de build omgaan met verschillen in de beveiligingsinstellingen, beveiligings-ID's, machtigingen, gebruikersinstellingen of de rollidmaatschappen van log-ins van de build, voor de verschillende serveromgevingen?
Dit hangt sterk af van de context van de build en de manier waarop de database omgaat met toegangscontrole.
Als de database is ontworpen om levende persoonlijke, financiële of medische gegevens te bevatten, is het waarschijnlijk illegaal om hetzelfde team van mensen zowel de database te laten bouwen als de toegangsrechten of beveiligingsinstellingen voor databaseobjecten te bepalen.
Het is het beste om deze afzonderlijk te bewaren in een centraal CMS-archief door bewerkingen, en te bepalen op basis van het feit of de database echte gegevens of vervalste testgegevens bevat.
In de praktijk is het logisch om het toegangscontrolesysteem voor ontwikkeling te baseren op databaserollen en deze toe te wijzen aan gebruikers of Windows-groepen door middel van een build-script dat is gebaseerd op het script dat in de release wordt geleverd.
Maar met de juiste toewijzingen voor de server. omgeving, of het nu gaat om QA, staging of productie, en bewaard in een CMS-archief.
Binnen de ontwikkeling wordt het probleem enorm vereenvoudigd, zolang live gegevens nooit zijn toegestaan.
De ontwikkel- en testbuilds kunnen ongehinderd verlopen.
Zodra live gegevens worden gebruikt, zoals bij enscenering, forensische analyse of productie, moeten alle instellingen voor beveiliging en toegangscontrole voldoen aan het wettelijke kader dat van kracht is.
Het is gemakkelijker om te rapporteren over een geautomatiseerde build, en naast eenvoudige feiten zoals de tijd die het kostte en of het lukte, het aantal waarschuwingen en zelfs een algehele codekwaliteitsstatistiek, of codebeleid, indien nodig.
Dit stelt het bestuursproces in staat om zijn audit- en verantwoordingstaken uit te voeren en de planning van schattingen vast te stellen.
Elk build- en versiebeheersysteem moet ontwikkelaars, maar ook mensen buiten het ontwikkelteam, in staat stellen te zien wat er verandert en waarom, zonder dat er tijdrovende vergaderingen en formele processen nodig zijn.
Overwegingen bij het bouwen van geavanceerde databases
Er lijkt een oneindige verscheidenheid aan databases te zijn en dit komt tot uiting in het aantal opties waarmee rekening moet worden gehouden bij het bouwen en het daaropvolgende implementatieproces.
Er zijn veel keuzes te bouwen over hoe de build wordt verwerkt in het geval van verschillende eventualiteiten. Hier zijn er slechts enkele van.
Is de serverversie (platform) compatibel met de databasecode?
Verschillende versies en edities van het RDBMS hebben verschillende mogelijkheden.
Het is gemakkelijk om werkende code te produceren voor één versie van SQL Server die volledig zal falen, op een subtiel andere manier zal werken, of met verminderde prestaties, op een andere versie.
Een database is altijd gecodeerd voor een bepaalde versie van het RDBMS.
Als de databasespecificatie het compatibiliteitsniveau van de database bevat, of het bereik van versies waarop het moet draaien, dan moet het build-script een bewakingsclausule bevatten om de compatibiliteit en versie van de host SQL Server waarop de database wordt geïnstalleerd te controleren, en mislukt de build als deze onjuist is.
Is de standaardsortering van de database de juiste?
Een sortering heeft invloed op de manier waarop een database zich gedraagt.
Soms is het effect opmerkelijk, zoals wanneer u overschakelt van een hoofdlettergevoelige sortering naar een niet hoofdlettergevoelige sortering of omgekeerd.
Het heeft ook invloed op de manier waarop gegevens worden gesorteerd of de manier waarop jokertekenuitdrukkingen worden geëvalueerd.
Dit zal subtiele bugs produceren die lang kunnen duren om op te merken en te corrigeren.
Het build-script moet, om veilig te zijn, de database-sortering controleren en een fout veroorzaken als deze onjuist is.
Kunnen eigenschappen op databaseniveau tijdens de build worden gewijzigd?
Code die werkt onder één databaseconfiguratie, kan eenvoudig worden gestopt door een configuratie-item op databaseniveau te wijzigen.
Wanneer een server een database maakt, gebruikt deze de configuratie op modeldatabaseniveau die in de database is ingesteld.
Dit kan heel anders zijn dan de databaseconfiguratie op de servers van de ontwikkelaars, en als deze verschillen worden toegestaan, zal het resultaat grote schade aanrichten.
Het build-script moet controleren of de database de juiste configuratie heeft voor zaken als het standaard isolatieniveau, datumnotatie, taal, ANSI null waarden.
Moet de database die wordt gebouwd, dan als een bepaalde versie op de server worden geregistreerd?
Met SQL Server kunnen databases worden geregistreerd wanneer ze worden gebouwd of gewijzigd, wat betekent dat een XML-momentopname van de metagegevens van een database wordt opgeslagen op de server en kan worden gebruikt om te controleren of er achteraf geen ongeautoriseerde wijzigingen zijn aangebracht.
Het is over het algemeen een goede voorzorgsmaatregel om een database te registreren als u DacFx gebruikt, maar zeer grote databases kunnen mogelijk aanzienlijke ruimte in beslag nemen.
Moeten alle beperkingen worden gecontroleerd nadat alle gegevens in de build zijn ingevoegd?
Dit is alleen van toepassing als er een soort statische gegevens in de database worden geïmporteerd als onderdeel van de build.
Om een snelle gegevensimport te garanderen, worden beperkingen tijdens het importeren uitgeschakeld en vervolgens opnieuw ingeschakeld nadat de taak is voltooid.
Door de beperkingen opnieuw in te schakelen, worden alle gegevens in één keer achteraf gecontroleerd.
Dit is de beste tijd om dit te doen, maar het kan zijn dat er later meer gegevens in een gerelateerde tabel moeten worden ingevoegd, en daarom moet dit misschien worden uitgesteld.
Moet de build verschillen in bestandspaden, kolomsortering en andere instellingen toestaan?
Veel paden en database- of serverinstellingen kunnen per serveromgeving verschillen.
Er zullen bijvoorbeeld waarschijnlijk verschillende bestandspaden zijn voor gegevens- en logbestanden, misschien verschillende bestands groep plaatsingen, een ander pad naar volledige-tekst indexbestanden of voor een cryptografische provider.
Sommige instellingen, zoals bestandspaden, logbestandspaden, plaatsing op een partitieschema, het pad naar full-text indexbestanden, bestands groep plaatsingen of bestandsgroottes, hebben niets te bouwen met ontwikkeling en veel met bewerkingen en serverbeheer.
Ze zijn afhankelijk van de manier waarop de server is geconfigureerd.
Men kan stellen dat hetzelfde geldt voor FillFactor.
Er zijn gevaren verbonden aan het overschrijven van zaken als het zaad of de toename van identiteitskolommen of sortering.
Deze instellingen moeten in een afzonderlijk build script voor elke serveromgeving staan of worden afgehandeld door SQLCMD variabelen die tijdens de uitvoering worden ingesteld.
Hoe moet de build omgaan met verschillende beveiligingsopties tussen serveromgevingen?
Hoe moet de build omgaan met verschillen in de beveiligingsinstellingen, beveiligings-ID's, machtigingen, gebruikersinstellingen of de rollidmaatschappen van log-ins van de build, voor de verschillende serveromgevingen?
Dit hangt sterk af van de context van de build en de manier waarop de database omgaat met toegangscontrole.
Als de database is ontworpen om levende persoonlijke, financiële of medische gegevens te bevatten, is het waarschijnlijk illegaal om hetzelfde team van mensen zowel de database te laten bouwen als de toegangsrechten of beveiligingsinstellingen voor databaseobjecten te bepalen.
Het is het beste om deze afzonderlijk te bewaren in een centraal CMS-archief door bewerkingen, en te bepalen op basis van het feit of de database echte gegevens of vervalste testgegevens bevat.
In de praktijk is het logisch om het toegangscontrolesysteem voor ontwikkeling te baseren op databaserollen en deze toe te wijzen aan gebruikers of Windows-groepen door middel van een build-script dat is gebaseerd op het script dat in de release wordt geleverd.
Maar met de juiste toewijzingen voor de server. omgeving, of het nu gaat om QA, staging of productie, en bewaard in een CMS-archief.
Binnen de ontwikkeling wordt het probleem enorm vereenvoudigd, zolang live gegevens nooit zijn toegestaan.
De ontwikkel- en testbuilds kunnen ongehinderd verlopen.
Zodra live gegevens worden gebruikt, zoals bij enscenering, forensische analyse of productie, moeten alle instellingen voor beveiliging en toegangscontrole voldoen aan het wettelijke kader dat van kracht is.
Database laten bouwen of zelf doen?
Bij het bouwen van een databasetoepassing is het een vergissing te denken dat het bouwen van een database een eenvoudige taak is. Dat is het niet. Het moet worden gepland, gescript en geautomatiseerd worden.
De build moet altijd starten vanuit een bekende staat, in het versiebeheersysteem.
U kunt dan verschillende middelen gebruiken om de scripts te genereren die nodig zijn voor een build of migratie.
U moet testen om de build te valideren en ervoor te zorgen dat u op een veilige manier de juiste items bouwt.
U hebt instrumenten en metingen nodig die de tijd van de build, de versie die wordt gebouwd en het succes van de build, samen met waarschuwingsberichten registreren.
Voor waarschuwingen en fouten is, indien nodig, een gedetailleerde diagnose nodig om de exacte oorzaak van de storing snel te kunnen achterhalen.
Wat zijn hier de gevolgen van?
Als gevolg hiervan zal uw database regelmatig en punctueel worden opgebouwd en vrijgegeven, en zult u potentiële problemen vroeg in de cyclus opmerken en oplossen.
Ook zult u de metingen hebben die zullen aantonen hoeveel uw processen verbeteren en hoeveel hoger de kwaliteit en snelheid van uw ontwikkelprocessen is geworden.
Advies nodig over het bouwen van een database? Contact ons dan direct!
De build moet altijd starten vanuit een bekende staat, in het versiebeheersysteem.
U kunt dan verschillende middelen gebruiken om de scripts te genereren die nodig zijn voor een build of migratie.
U moet testen om de build te valideren en ervoor te zorgen dat u op een veilige manier de juiste items bouwt.
U hebt instrumenten en metingen nodig die de tijd van de build, de versie die wordt gebouwd en het succes van de build, samen met waarschuwingsberichten registreren.
Voor waarschuwingen en fouten is, indien nodig, een gedetailleerde diagnose nodig om de exacte oorzaak van de storing snel te kunnen achterhalen.
Wat zijn hier de gevolgen van?
Als gevolg hiervan zal uw database regelmatig en punctueel worden opgebouwd en vrijgegeven, en zult u potentiële problemen vroeg in de cyclus opmerken en oplossen.
Ook zult u de metingen hebben die zullen aantonen hoeveel uw processen verbeteren en hoeveel hoger de kwaliteit en snelheid van uw ontwikkelprocessen is geworden.
Advies nodig over het bouwen van een database? Contact ons dan direct!