Results 1 to 13 of 13

Thread: transactie

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    transactie

    Ik ga een database verbouwen d.w.z. contraints en triggers tijdelijk uitzetten en ongeveer in de helft van deze database vele vele velden, tabellen, koppeltabellen etc. aanpassen + records verwijderen.
    Het gaat goed, of het gaat niet goed. Tussenstappen zijn er eigenlijk niet.
    Eigenlijk wil je dan dat alles in 1 transactie zetten en rollbacken als er ergens iets fout gaat. Maar dat is misschien teveel gevraagd.
    Hoe gaat dat: een enorme transactie? Werkt dat snel en goed? of is dat raar?
    Restore backup is de andere optie :-)

  2. #2
    Ik denk dat backup restore de enige "transactie" is die je kunt gebruiken. Bij mijn weten kun je DDL statements niet rollbacken.

    Ik zou alle veranderingen eerst op een copy van de database doorvoeren. Steeds in kleine stapjes en daar een diff script van maken. Vervolgens kijken of het eindresultaat valideren. Als dit werkt kun je dezelfde stappen uitvoeren op de productie database (die op dat moment niet gebruikt mag worden). Zorg voor goede backups!

  3. #3
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Ik gebruik geen DDL. Vandaar...
    En het wordt zeker 25 keer op een lokale backup kapot gemaakt en getest :-)

    Sterker nog. We halen de database binnen en zetten hem terug.

  4. #4
    Wat voor database gebruik je?

  5. #5
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    ms sql

  6. #6
    Quote Originally Posted by EricLang View Post
    Ik gebruik geen DDL. Vandaar...
    Je gebruikt geen DDL? Hoe wil je dan tabellen aanpassen???

    Common DDL statements are CREATE, ALTER, and DROP

  7. #7
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    ah... lang verhaal.
    er is een tabel HELEMAAL bovenin met twee entries, waardoor de database (200 tabellen) in tweeen splitst qua inhoud. genoemd hier: "basismodellen".
    Nu wil een klant deze twee basismodellen samenvoegen. Inrichting is al klaar en ik kan alles inhoudelijk gelijktrekken. Dus puur inhoud.

  8. #8
    Constraints en triggers uitzetten valt in ieder geval wel onder DDL.

    En in die periode wil je ook niet dat mensen naar die database gaan schrijven, want dan krijg je wellicht corrupte data.

    Je zou het in een enkele transactie kunnen doen, maar een (wellicht beter) alternatief is om de data samen te voegen in een derde basismodel, en dat te gaan gebruiken als het samenvoegen helemaal gelukt it. Gaat er iets mis, dan kan je het derde basismodel droppen en het nog een keer proberen. Voordeel is dat je de tests kunt doen terwijl je database online is. Je kopie hoeft dan nog niet 100% dekkend te zijn, en je kan het derde model opbouwen terwijl de database in gebruik is. Na die testrun weet je ongeveer wat je nog op moet lossen, maar ook hoe lang het duurt. Je kan dan een duidelijke verwachting naar je klant uitspreken over hoe lang de database offline moet zijn voor de daadwerkelijke migratie.

    Mocht die periode te lang zijn, dan kan je er zelfs voor kiezen om een bulkkopie te maken terwijl de database online is, en voor het laatste stukje van de migratie alleen de wijzigingen kopieren. Met een goede middleware of een hoop triggermagie zou je de boel in sync kunnen brengen en houden, en op een bepaald model het schrijven wisselen van 1 en 2 naar 3. Je database hoeft dan helemaal niet offline, en misschien zelfs niet of maar heel kort, op readonly voor de clients.
    1+1=b

  9. #9
    Je zou het in een enkele transactie kunnen doen
    Ik dacht dat DDL altijd impliciet gecommit werd.

  10. #10
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Ik ga het toch gewoon proberen :-)
    Ik kan alle contraints voor de hele database disablen en enablen DISABLE CONTRAINTS for database.
    Dit doe ik dan buiten de transactie.
    Weet iemand of ENABLE CONSTRAINTS for database ook daadwerkelijk alles gaat checken?

  11. #11
    Quote Originally Posted by EricLang View Post
    Ik ga het toch gewoon proberen :-)
    Ik kan alle contraints voor de hele database disablen en enablen DISABLE CONTRAINTS for database.
    Dit doe ik dan buiten de transactie.
    Dat moet wel buiten de transaction zijn want die kan niet binnen een transaction disabled worden.

    Weet iemand of ENABLE CONSTRAINTS for database ook daadwerkelijk alles gaat checken?
    Ja.

  12. #12
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Mooi. Ik weet het nog niet ZEKER van die checkconstraints weer aanzetten.
    Voor de zekerheid heb ik ook een magische CheckAllForeignKeys geschreven (erg leuk).
    Code:
      
      DmoMain.DisableTriggersAndConstraints;
      try
        DmoMain.Connection.StartTransaction;
        try
          // do my stuff
          DmoMain.Connection.Commit;
        except
          DmoMain.Connection.RollBack;
          raise;
        end;
      finally
        DmoMain.EnableTriggersAndConstraints;
      end;

  13. #13
    Quote Originally Posted by luigi View Post
    Ik dacht dat DDL altijd impliciet gecommit werd.
    Hangt van de database af (op MS SQL Server is dat inderdaad zo).

    Maar op een database waar dat het geval is, kan je wel beginnen met triggers en constraints uitschakelen en daarna binnen een transactie de datamigratie doen. Het is heel lastig uitpluizen wat de status is als je DML halverwege afgebroken wordt, en de helft is gecommit. Voor de status van triggers is dat een stuk makkelijker, dus ook een minder groot probleem als je daar geen transactie voor hebt.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •