Transazioni nidificate in postgresql 8.2?
-
03-07-2019 - |
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.
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.