Pregunta

Estoy trabajando en scripts que aplican actualizaciones de esquema de base de datos. He configurado todos mis scripts de actualización de SQL usando iniciar transacción / cometer. Paso estos scripts a psql en la línea de comandos.

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, y luego juntarlos dentro de un nuevo bloque de inicio de transacción / confirmación. Estoy escribiendo scripts de Perl para hacer esto sobre la marcha.

Efectivamente, quiero transacciones anidadas, que no puedo averiguar cómo hacerlo en postgresql.

¿Hay alguna forma de hacer o simular transacciones anidadas para este propósito? Tengo la configuración configurada para rescatar automáticamente cualquier error, por lo que no necesito continuar en la transacción de nivel superior si falla alguno de los más bajos.

¿Fue útil?

Solución

Bueno, tienes la posibilidad de usar transacciones anidadas dentro de postgresql usando SavePoints.

Toma 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.

Otros consejos

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 inicio de transacción / confirmación, luego las empujo en un solo archivo, que es propio iniciar transacción / cometer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top