2010-04-30 20 views
11

Uso Postgresql con las extensiones PostGIS para el análisis espacial ad-hoc. Generalmente construyo y expido consultas SQL a mano desde psql. Siempre envuelvo una sesión de análisis dentro de una transacción, por lo que si emite una consulta destructiva puedo revertirla.¿Puedo pedirle a Postgresql que ignore los errores dentro de una transacción?

Sin embargo, cuando publico una consulta que contiene un error, cancela la transacción. Cualquier consulta posterior provocará la siguiente advertencia:

ERROR: current transaction is aborted, commands ignored until end of transaction block

¿Hay alguna manera de desactivar este comportamiento? Es tedioso deshacer la transacción y volver a ejecutar las consultas anteriores cada vez que hago un error tipográfico.

Respuesta

10

(ACTUALIZACIÓN: No hay necesidad de esto a mano, me preguntó en las listas de correo de PostgreSQL, y resultó que este comportamiento ya está implementado, por el ON_ERROR_ROLLBACK conjunto en el cliente psql)

Para más detalles sobre Simon respuesta (+1), en su escenario podría agregar rutinariamente un punto de rescate después de cada consulta interactiva, siempre con el mismo nombre (sobreescribe el anterior si la consulta es exitosa). En caso de error, regrese al último guardado y continúe desde allí.

Un ejemplo de este patrón de trabajo:

db=# select * from test_gral ; 
i | t | n 
---+------+------ 
1 | text | 10.0 
(1 row) 

db=# begin; 
BEGIN 
db=# insert into test_gral values (2,'xx',20); savepoint sp; 
INSERT 0 1 
SAVEPOINT 
db=# insert into test_gral values (3,'xx',30); savepoint sp; 
INSERT 0 1 
SAVEPOINT 
db=# insert into test_gralxx values (4,'xx',40); savepoint sp; 
ERROR: relation "test_gralxx" does not exist 
LINE 1: insert into test_gralxx values (4,'xx',40); 
        ^
ERROR: current transaction is aborted, commands ignored until end of transaction block 
db=# ROLLBACK TO SAVEPOINT sp; 
ROLLBACK 
db=# insert into test_gral values (4,'xx',40); savepoint sp; 
INSERT 0 1 
SAVEPOINT 
db=# commit; 
COMMIT 
db=# select * from test_gral ; 
i | t | n 
---+------+------ 
1 | text | 10.0 
2 | xx | 20 
3 | xx | 30 
4 | xx | 40 
(4 rows) 
+0

la variable ON_ERROR_ROLLBACK hace exactamente lo que yo quería :) – fmark

+0

'ON_ERROR_ROLLBACK' parece una característica del cliente psql, no se postgrega a sí mismo (por lo que no puede usar esto desde una aplicación de base de datos, solo desde la línea de comandos). – Glyph

+1

@Glyph: sí, esa es una característica de psql, está específicamente orientada al uso interactivo, que era el escenario del PO. Es difícil para mí pensar en un escenario de aplicación cuando el comportamiento deseado tendría sentido. – leonbloy

2

No, no hay forma de desactivar esto. Un error interrumpe implícitamente la transacción por usted, por lo que debe deshacer e intentar de nuevo.

+0

+1 de hecho (15 caracteres) –

+0

Pensé que también, pero no. Ver mi respuesta – leonbloy

1

Es posible escribir una función que toma un argumento de cadena, executes, y usa una cláusula exception para no abortar su transacción, pero es una gran molestia tener que llamar a esa función para cada instrucción que desee ejecutar.

0

La respuesta simple es ejecutar

my_db=> \set ON_ERROR_ROLLBACK interactive 

en la sesión interactiva. Ver también this blog post por su implementador.

Cuestiones relacionadas