Het ziet er naar uit dat ik 2 opties heb.
Ik zal eerst ff de situatie schetsen:
Ik heb dus 3 locaties waar m'n databank komt te staan. Deze databases moeten synchroon gehouden worden.
Veranderingen aan de data kunnen normaal gezien enkel gebeuren via core components die we geschreven hebben, en die core-components worden via .NET remoting gehost in IIS.
De applicaties die access hebben tot deze databank, zullen dus normaal gezien via deze core components (via IIS dus) toegang verkrijgen tot de DB.
Optie 1 om database-structuur wijzigingen door te voeren:
- de database-wijzigigen doorvoeren dmv system stored procedures. Deze SP's laten het toe om een tabel-strcutuur te veranderen van een database die onder replicatie staat, en deze zou er ook moeten voor zorgen dat de structuurwijzigingen doorgevoerd worden naar de andere sites.
Optie 2:
- Een procedure maken die ervoor zorgt dat de DB - patches op alle 3 de sites automatisch doorgevoerd worden, en dat op een velige manier: daarvoor zullen de DB's eerst uit replicatie moeten gehaald worden, IIS zal op de 3 sites moeten gestopt worden, de DB patches op de 3 sites laten uitvoeren, replicatie opnieuw opzetten en IIS opnieuw starten.
Beide opties hebben zo wel hun nadelen:
Optie 1 is vrijwel onbruikbaar aangezien we structuurwijzigingen aan de DB doen via scripts. Deze scripts schrijven we niet zelf, maar laten we genereren door een vergelijking te maken van de oude versie van de DB en de nieuwe versie. (We gebruiken Visio voor het DB model bij te houden, en RedGate SQL Bundle om 2 db's te vergelijken).
Deze scripts die gegenereerd worden, zijn 'gewone' scripts die gewone ALTER TABLE statements etc... bevatten.
Het is ook niet altijd noodzakelijk dat een script toegepast wordt op een DB die onder replicatie staat. (Bv, een DB op een development WS / Server).
Optie 2 kan gevaarlijk zijn, wat als er toch iemand op een of andere manier een wijziging kan doen aan de data terwijl de replicatie offline is. Het is geen goed idee om iedere keer dat er een DB patch toegepast wordt, de initiele snapshot opnieuw te laten genereren en te propageren naar de andere sites. De DB zal, eens hij in productie gaat, ongeveer 4 GB aan data bevatten, en het is niet werkbaar om de databases opnieuw van 0 te synchronizeren iedere keer dat er een DB patch toegepast wordt.
Weet iemand of er nog andere opties zijn, of een manier om optie 2 veiliger te maken ?
https://fgheysels.github.io/