Insert Anweisungen in PostgreSQL rückgängig machen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Insert Anweisungen in PostgreSQL rückgängig machen

    Hallo!

    Ich habe folgendes Problem:

    Eine Textdatei enthält so um die 100 Insert - Anweisungen.
    Ein PHP Skript macht den Connect auf eine Datenbank, liest die Datei zeilenweise aus, und führt die Insert Befehle per "pg_query" aus. Soweit funzt alles.
    Ich möchte nun aber wissen wie ich es am besten angehe, wenn ich im nachhinein, nachdem die Datensätze erfolgreich eingefügt wurden genau diese wieder entfernen möchte.
    Ich dachte ich könnte die Anweisungen in ein "BEGIN - COMMIT" packen, aber das nützt mir doch nur was, wenn ich bei BEGIN TANSACTION danach noch einen Bezeichner angeben kann oder? PostgreSQL verträgt aber offensichtlich keinen Bezeichner nach diesem Befehl.
    Ich hab mir gedacht ich könnte die Anweisungen also in einen Block packen, diesem Block einen Namen geben, um später irgendwann ein ROLLBACK zu diesem Namen zu machen.
    Kann mir jemand dazu einen Tip geben? Vielen Dank.

    Wassim

  • #2
    jede Ausführung in PG-SQL ist eine in sich geschlossene Transaction, welche implizit vom DBMS gestartet wird. D.h. eine Aktion derart:

    insert into tbl (lid,strvalue) values (1,'aaa')

    wird intern mit Transactionbeginn, Statementausführung und Commit abgeschlossen. Für Multistatement Transaction machst du einfach:

    BEGIN MARK;
    INSERT ...
    INSERT ...
    INSERT ...
    COMMIT MARK;

    oder

    BEGIN MARK;
    DELETE ...
    DELETE ...
    ROLLBACK MARK;

    HTH

    Kommentar


    • #3
      Re: Insert Anweisungen in PostgreSQL rückgängig machen

      Original geschrieben von Wassim
      das nützt mir doch nur was, wenn ich bei BEGIN TANSACTION danach noch einen Bezeichner angeben kann oder?
      warum?

      das würde sinn machen, wenn du mehrere transaktionen verschachteln wolltest, aber wer will das schon...
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        Vielen Dank Euch beiden für die schnelle Antwort!

        Das bringt mich irgendwie nur bedingt weiter.
        Wenn ich also folgendes schreibe:

        BEGIN MARK;
        INSERT ...
        INSERT ...
        ...
        ...
        COMMIT MARK;

        die Transaktion wird erfolgreich durchgeführt, und ich möchte in 3 Wochen die komplette Transaktion MARK rückgängig machen, wie kriege ich das hin?

        Vielen Dank!

        Wassim

        Kommentar


        • #5
          Original geschrieben von Wassim
          wie kriege ich das hin?
          Du verstehst das Transaktionskonzept?

          Sicher?

          Alles was du nach BEGIN machst wird endgültig gespeichert, sobal du COMMIT machst oder wieder verworfen wenn du ROLLBACK machst

          wenn es in der datenbank steht, dann bekommst du es nicht mehr raus...

          es sei denn, du hast dir irgendwie identifizierende markmale besorgt, die die 100 datensätzen von allen, die davor drinstanden und denen, die danach dazukamen unterscheiden
          dann kannst du sie mit DELETE rausschmeißen
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Hat keiner behauptet dass ich das Transaktionskonzept verstehe.
            Könnte ich nicht vielleicht eine Art Savepoint erstellen und im nachhinein alle ab diesem Savepoint durchgeführten TA verwerfen?

            Wassim

            Kommentar


            • #7
              du könntest die datenbank komplett kopieren und dann später ggf. die kopie "drüberbügeln"

              je nachdem wie groß die datenbank ist gibt's es aber auch schön diverse before images und after images durch replizierungen (wenn psotgresql das unterstützt)
              dann kannst dud idch einfach daran bedienen
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Klasse Idee.
                Ich werde dann mal schauen dass ich das so hinbekomme.

                Vielen Dank!

                Wassim

                Kommentar

                Lädt...
                X