Respostas:
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 -X
parâ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
Presumo que você esteja usando psql
, isso pode ser útil para adicionar ao seu ~/.psqlrc
arquivo.
\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
--single-transaction
for usado, -v ON_ERROR_STOP=1
ainda é necessário para um status existente diferente de zero
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.
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_STOP
configuração como on, quando o psql detectar um erro no código sql, ele sairá e retornará 3
ao shell.
-v ON_ERROR_STOP=ON
também funciona, pelo menos com 9.2. Suspeito que qualquer uma das variantes do booleano "verdadeiro" seja permitida.