¿Cómo puedo detener un script de Postgres cuando encuentra un error?

95

¿Hay alguna manera de especificar que cuando se ejecuta un script sql se detiene cuando encuentra el primer error en el script, por lo general continúa, independientemente de los errores anteriores?

Rayo
fuente

Respuestas:

156

Creo que la solución para agregar seguimiento a .psqlrc está lejos de la perfección

\set ON_ERROR_STOP on

Existe una forma mucho más simple y conveniente: use psql con el parámetro:

psql -v ON_ERROR_STOP=1

es mejor usar también el -Xparámetro que desactiva el uso de archivos .psqlrc. Funciona perfectamente para mi

ps la solución encontrada en un gran post de Peter Eisentraut. ¡Gracias, Peter! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

Alfishe
fuente
8
-v ON_ERROR_STOP=ONtambién funciona, al menos con 9.2. Sospecho que se permite cualquiera de las variantes de boolean "true" .
jpmc26
No funciona en modo interactivo, lo que me confundió por un minuto.
Sam Watkins
21

Supongo que está utilizando psql, esto podría ser útil para agregar a su ~/.psqlrcarchivo.

\set ON_ERROR_STOP on

Esto hará que se anule en el primer error. Si no lo tiene, incluso con una transacción, seguirá ejecutando su script pero fallará en todo hasta el final de su script.

Y probablemente desee utilizar una transacción como dijo Paul. Lo cual también se puede hacer psql --single-transaction ...si no desea alterar el guión.

Entonces, un ejemplo completo, con ON_ERROR_STOP en su .psqlrc:

psql --single-transaction --file /your/script.sql
plundra
fuente
2
Incluso si la transacción falla, el estado de salida del comando psql sigue siendo 0.
Dr. Person Person II
4
De hecho, incluso si --single-transactionse usa, -v ON_ERROR_STOP=1sigue siendo necesario para un estado de existencia distinto de cero
bitek
8

No es exactamente lo que desea, pero si comienza su secuencia de comandos con begin transaction;y termina con end transaction;, en realidad omitirá todo después del primer error y luego revertirá todo lo que hizo antes del error.

Paul Tomblin
fuente
Es cierto, pero aún analiza todo. Y si desea realizar una segunda transacción solo si la primera tuvo éxito, esto no funcionará.
Comodín
Sí, y no olvidar continuar cuando encuentre errores de DDL Create table ... (versión: postrgres 10). Sí, salta una mesa y pasa a las demás ...
JL Peyret
0

Siempre me gusta hacer referencia al manual directamente.

Del manual de PostgreSQL :

Estado de salida

psql devuelve 0 al shell si finalizó normalmente, 1 si se produce un error fatal propio (por ejemplo, memoria insuficiente, archivo no encontrado), 2 si la conexión con el servidor falló y la sesión no fue interactiva y 3 si se produjo un error en un script y se estableció la variable ON_ERROR_STOP.

De forma predeterminada, si el código sql que está ejecutando en el error del servidor PostgreSQL, psql no saldrá del error. Detectará el error y continuará. Si, como se mencionó anteriormente, establece la ON_ERROR_STOPconfiguración en activado, cuando psql detecta un error en el código SQL, saldrá y regresará 3al shell.

Gregorio Arenio
fuente