Frage

Ich bin auf Skripte, das Datenbankschema Updates anwenden. Ich habe Setup alle meine SQL-Update-Skripte mit Starttransaktion / commit. Ich gebe diese Skripte auf der Kommandozeile psql.

Ich brauche jetzt mehrere Skripte zur gleichen Zeit anzuwenden und in einer einzigen Transaktion. Bisher ist die einzige Lösung, die ich habe kommen mit ist die Starttransaktion / commit aus dem ursprünglichen Satz von Skripten zu entfernen und sie dann in einem neuen Starttransaktion / commit jammen Block. Ich schreibe Perl-Skripte diese on the fly zu tun.

Effektiv möchte ich verschachtelte Transaktionen, die ich nicht herausfinden kann, wie in postgresql zu tun.

Gibt es eine Möglichkeit verschachtelte Transaktionen zu diesem Zweck zu tun oder zu simulieren? Ich habe Dinge Setup automatisch auf jedem Fehler zu retten, so brauche ich nicht in der Top-Level-Transaktion fortzusetzen, wenn eine der Niederen versagen.

War es hilfreich?

Lösung

Nun haben Sie die Möglichkeit, verschachtelte Transaktionen innerhalb postgresql mit Savepoints zu verwenden.

Nehmen Sie das Codebeispiel:

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

Vielleicht haben Sie dies helfen wird, ein wenig aus.

Andere Tipps

Ich habe am Ende ‚Lösung‘ mein Problem aus Band - ich ein Perl-Skript verwenden die Eingangs Skripte Nacharbeiten ihre Starttransaktion zu beseitigen / Anrufe begehen, dann schieben sie alle in eine Datei, die es selbst bekommt starten Sie die Transaktion / commit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top