119 votes

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

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 habituellement, indépendamment des erreurs précédentes.

185voto

Alfishe Points 347

Je pense que la solution consistant à ajouter ce qui suit au fichier .psqlrc est loin d'être parfaite.

\set ON_ERROR_STOP on

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

psql -v ON_ERROR_STOP=1

à utiliser également -X paramètre désactivant l'utilisation du fichier .psqlrc. Fonctionne parfaitement pour moi

p.s. la solution se trouve dans un excellent billet de Peter Eisentraut. Merci, Peter ! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-avec-psql.html

30voto

plundra Points 4607

Je suppose que vous utilisez psql il pourrait être utile de l'ajouter à votre site Web. ~/.psqlrc fichier.

\set ON_ERROR_STOP on

Cela le fera avorter à 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 voulez probablement utiliser une transaction comme Paul l'a dit. Ce qui peut aussi être fait avec psql --single-transaction ... si vous ne voulez pas modifier le script.

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

psql --single-transaction --file /your/script.sql

9voto

Paul Tomblin Points 83687

Ce n'est pas exactement ce que vous voulez, mais si vous commencez votre script par begin transaction; et se terminent par end transaction; il ignore tout ce qui se passe après la première erreur et revient sur tout ce qu'il a fait avant l'erreur.

0 votes

C'est vrai, mais ça analyse quand même tout. Et si vous voulez faire un deuxième transaction que si la première a réussi, cela ne fonctionnera pas.

0 votes

Oui, et sans oublier de continuer lorsqu'il rencontre des erreurs DDL Create table... (version : postrgres 10). Oui, il saute une table et passe aux autres...

1voto

Gregory Arenius Points 1039

Je préfère toujours me référer directement au manuel.

De la Manuel PostgreSQL :

Statut de sortie

psql retourne 0 à l'interpréteur de commandes s'il s'est terminé normalement, 1 si une erreur fatale est survenue. fatale propre (par exemple, mémoire insuffisante, fichier non trouvé), 2 si la connexion au connexion au serveur s'est mal passée et que la session n'était pas interactive, et 3 si une erreur s'est produite dans un script et que la variable ON_ERROR_STOP a été définie.

Par défaut, si le code sql que vous exécutez sur le serveur PostgreSQL est erroné, psql n'affichera pas d'erreur. Il attrapera l'erreur et continuera. Si, comme mentionné ci-dessus, vous définissez l'option ON_ERROR_STOP sur on, quand psql attrape une erreur dans le code sql, il sortira et retournera le code. 3 à l'obus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X