Como posso interromper um script Postgres quando ele encontra um erro?

95

Existe uma maneira de especificar que ao executar um script sql ele pare ao encontrar o primeiro erro no script, ele geralmente continua, independentemente dos erros anteriores.

Raio
fonte

Respostas:

156

Acho que a solução para adicionar o seguinte ao .psqlrc está longe da perfeição

\set ON_ERROR_STOP on

existe uma maneira muito mais simples e conveniente - use o psql com o parâmetro:

psql -v ON_ERROR_STOP=1

melhor usar também o -Xparâmetro desligando o uso do arquivo .psqlrc. Funciona perfeitamente para mim

ps a solução encontrada em ótimo post de Peter Eisentraut. Obrigado, Peter! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

Alfishe
fonte
8
-v ON_ERROR_STOP=ONtambém funciona, pelo menos com 9.2. Suspeito que qualquer uma das variantes do booleano "verdadeiro" seja permitida.
jpmc26 de
Não funciona no modo interativo, o que me confundiu por um minuto.
Sam Watkins
21

Presumo que você esteja usando psql, isso pode ser útil para adicionar ao seu ~/.psqlrcarquivo.

\set ON_ERROR_STOP on

Isso o fará abortar no primeiro erro. Se você não o tiver, mesmo com uma transação, ele continuará executando o seu script, mas falhará em tudo até o final do seu script.

E você provavelmente deseja usar uma transação, como Paulo disse. O que também pode ser feito psql --single-transaction ...se você não quiser alterar o script.

Portanto, um exemplo completo, com ON_ERROR_STOP em seu .psqlrc:

psql --single-transaction --file /your/script.sql
plundra
fonte
2
Mesmo se a transação falhar, o status de saída do comando psql ainda é 0.
Dr. Person Person II
4
Na verdade, mesmo se --single-transactionfor usado, -v ON_ERROR_STOP=1ainda é necessário para um status existente diferente de zero
bitek
8

Não é exatamente o que você deseja, mas se você iniciar seu script com begin transaction;e terminar com end transaction;, ele na verdade pulará tudo após o primeiro erro e, em seguida, fará rollback de tudo o que fez antes do erro.

Paul Tomblin
fonte
É verdade, mas ainda analisa tudo. E se você quiser fazer uma segunda transação apenas se a primeira for bem-sucedida, isso não funcionará.
Wildcard
Sim, e não se esqueça de continuar quando encontrar erros de DDL Create table ... (versão: postrgres 10). Sim, pula uma mesa e vai para as outras ...
JL Peyret
0

Sempre gosto de consultar o manual diretamente.

Do manual do PostgreSQL :

Status de saída

psql retorna 0 para o shell se terminou normalmente, 1 se um erro fatal ocorrer (por exemplo, falta de memória, arquivo não encontrado), 2 se a conexão com o servidor for ruim e a sessão não for interativa e 3 se ocorreu um erro em um script e a variável ON_ERROR_STOP foi definida.

Por padrão, se o código sql que você está executando no servidor PostgreSQL, o erro psql não encerrará o erro. Ele detectará o erro e continuará. Se, conforme mencionado acima, você definir a ON_ERROR_STOPconfiguração como on, quando o psql detectar um erro no código sql, ele sairá e retornará 3ao shell.

Gregory Arenius
fonte