ejemplo - Transacciones anidadas en postgresql 8.2?
plpgsql transaction (2)
Estoy trabajando en scripts que aplican actualizaciones de esquema de base de datos. Configuré todos mis scripts de actualización de SQL usando start transaction / commit. Paso estos scripts a psql en la línea de comando.
Ahora necesito aplicar varios scripts al mismo tiempo y en una transacción. Hasta ahora, la única solución que he encontrado es eliminar la transacción de inicio / confirmación del conjunto original de scripts, luego unirlos dentro de un nuevo bloque de inicio de transacción / confirmación. Estoy escribiendo guiones Perl para hacer esto sobre la marcha.
De hecho, quiero transacciones anidadas, que no puedo descifrar cómo hacerlo en postgresql.
¿Hay alguna forma de hacer o simular transacciones anidadas para este fin? Tengo las cosas configuradas para rescatar automáticamente cualquier error, por lo que no es necesario que continúe en la transacción de nivel superior si falla alguno de los más bajos.
Bueno, tienes la posibilidad de usar transacciones anidadas dentro de postgresql usando SavePoints.
Tome este ejemplo de código:
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)
Tal vez esto te ayude un poco.
Terminé ''resolviendo'' mi problema fuera de banda. Utilizo un script de Perl para volver a trabajar los scripts de entrada para eliminar sus llamadas de transacción / confirmación de inicio, y luego insertarlos en un solo archivo, que obtiene su propia transacción de inicio / cometer.