Domanda

Sto lavorando a script che applicano aggiornamenti dello schema del database. Ho impostato tutti i miei script di aggiornamento SQL usando start transazioni / commit. Passo questi script a psql dalla riga di comando.

Ora devo applicare più script contemporaneamente e in un'unica transazione. Finora l'unica soluzione che ho trovato è rimuovere la transazione di avvio / commit dal set originale di script, quindi bloccarli insieme all'interno di un nuovo blocco di transazione / commit di avvio. Sto scrivendo script perl per farlo al volo.

In effetti voglio transazioni nidificate, che non riesco a capire come fare in postgresql.

Esiste un modo per eseguire o simulare transazioni nidificate a questo scopo? Ho impostato le cose per salvare automaticamente qualsiasi errore, quindi non ho bisogno di continuare con la transazione di livello superiore se una di quelle inferiori fallisce.

È stato utile?

Soluzione

Bene, hai la possibilità di usare transazioni nidificate all'interno di postgresql usando SavePoints.

Prendi questo esempio di codice:

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)

Forse questo ti aiuterà un po '.

Altri suggerimenti

Ho finito per 'risolvere' il mio problema fuori banda - Uso uno script perl per rielaborare gli script di input per eliminare le loro transazioni di inizio / commit, quindi inserirle tutte in un unico file, che ne ottiene il proprio avvia transazione / commit.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top