Estou tentando executar um arquivo de script sql em uma única transação. O arquivo contém inclusões para alguns outros scripts que, no meu exemplo, criam algumas tabelas. Se parece com isso:
\include ../tables/table1.cre
\include ../tables/table2.cre
...
\include ../tables/table10.cre
Estou executando usando psql
:
psql -X --set AUTOCOMMIT=off --set ON_ERROR_STOP=on -e --single-transaction -d my_db -f my_script.sql
O problema é que os erros com o comando include meta não causam uma reversão transactioniopn. por exemplo, se algum dos arquivos tableX.cre estiver faltando, quaisquer alterações antes de sua inclusão serão confirmadas. No entanto, se houver algum erro de sintaxe SQL, tudo funcionará conforme o esperado.
É possível manipular de alguma forma erros relacionados à inclusão e reverter a transação ativa?
Estou usando o PostgreSQL 9.2.1.
Finalmente, recebi uma resposta na lista de discussão pgsql-general de Adrian Klaver ( link )
Há algum tipo de comportamento inesperado ao usar as opções
--set ON_ERROR_STOP=on
e--single-transaction
. OON_ERROR_STOP
para o processamento, mas não reverte a transação atual em caso de erro \include.Portanto, a solução para meu problema inicial será remover a
single-transaction
opção e agrupar instruções BEGIN/COMMIT explícitas em meu script principal.