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 -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
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
--single-transactionfor usado, -v ON_ERROR_STOP=1ainda é 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_STOPconfiguração como on, quando o psql detectar um erro no código sql, ele sairá e retornará 3ao shell.
-v ON_ERROR_STOP=ONtambém funciona, pelo menos com 9.2. Suspeito que qualquer uma das variantes do booleano "verdadeiro" seja permitida.