Comment puis-je arrêter un script Postgres lorsqu'il rencontre une erreur?

95

Existe-t-il un moyen de spécifier que lors de l'exécution d'un script sql, il s'arrête lorsqu'il rencontre la première erreur sur le script, il continue généralement, quelles que soient les erreurs précédentes.

Rayon
la source

Réponses:

156

Je pense que la solution à ajouter à .psqlrc est loin d'être parfaite

\set ON_ERROR_STOP on

il existe un moyen beaucoup plus simple et pratique - utilisez psql avec le paramètre:

psql -v ON_ERROR_STOP=1

mieux utiliser également le -Xparamètre désactivant l'utilisation du fichier .psqlrc. Fonctionne parfaitement pour moi

ps la solution trouvée dans un excellent post de Peter Eisentraut. Merci Peter! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

Alfishe
la source
8
-v ON_ERROR_STOP=ONfonctionne également, au moins avec 9.2. Je soupçonne que toutes les variantes de booléen "true" sont autorisées.
jpmc26
Cela ne fonctionne pas en mode interactif, ce qui m'a dérouté pendant une minute.
Sam Watkins
21

Je suppose que vous utilisez psql, cela peut être pratique à ajouter à votre ~/.psqlrcfichier.

\set ON_ERROR_STOP on

Cela le fera abandonner sur la première erreur. Si vous ne l'avez pas, même avec une transaction, il continuera à exécuter votre script mais échouera sur tout jusqu'à la fin de votre script.

Et vous souhaitez probablement utiliser une transaction comme l'a dit Paul. Ce qui peut également être fait psql --single-transaction ...si vous ne souhaitez pas modifier le script.

Donc un exemple complet, avec ON_ERROR_STOP dans votre .psqlrc:

psql --single-transaction --file /your/script.sql
plundra
la source
2
Même si la transaction échoue, l'état de sortie de la commande psql est toujours 0.
Dr. Person Person II
4
En effet, même s'il --single-transactionest utilisé, il -v ON_ERROR_STOP=1est toujours nécessaire pour un statut d'existence non nul
bitek
8

Ce n'est pas exactement ce que vous voulez, mais si vous commencez votre script avec begin transaction;et que vous finissez par end transaction;, il ignorera tout après la première erreur, puis il annulera tout ce qu'il a fait avant l'erreur.

Paul Tomblin
la source
C'est vrai, mais il analyse toujours tout. Et si vous souhaitez effectuer une deuxième transaction uniquement si la première a réussi, cela ne fonctionnera pas.
Wildcard
Oui, et ne pas oublier de continuer quand il rencontre des erreurs de table DDL Create ... (version: postrgres 10). Oui, il saute une table et passe sur les autres ...
JL Peyret
0

J'aime toujours me référer directement au manuel.

À partir du manuel PostgreSQL :

État de sortie

psql renvoie 0 au shell s'il s'est terminé normalement, 1 si une erreur fatale se produit (par exemple, mémoire insuffisante, fichier non trouvé), 2 si la connexion au serveur a échoué et la session n'était pas interactive, et 3 si une erreur s'est produite dans un script et la variable ON_ERROR_STOP a été définie.

Par défaut, si le code sql que vous exécutez sur le serveur PostgreSQL, l'erreur psql ne quittera pas une erreur. Il détectera l'erreur et continuera. Si, comme mentionné ci-dessus, vous définissez le ON_ERROR_STOPparamètre sur on, lorsque psql détecte une erreur dans le code sql, il se ferme et retourne 3au shell.

Grégory Arenius
la source