2010-12-18 12 views
65

Czy istnieje sposób na określenie, że podczas wykonywania skryptu sql zatrzymuje się podczas napotkania pierwszego błędu w skrypcie, zwykle trwa, niezależnie od poprzednich błędów.Błąd PostgreSQL na błędzie skryptu

Dzięki

Odpowiedz

5

to nie jest dokładnie to, co chcesz, ale jeśli uruchomić skrypt z begin transaction; i kończą end transaction;, to faktycznie pominąć wszystko po pierwszym błędzie, a następnie będzie ona ROLLBACK wszystko to miało miejsce przed błędem .

+0

To prawda, ale nadal wszystko analizuje. A jeśli chcesz zrobić * sekundową * transakcję tylko wtedy, gdy pierwsza się powiedzie, to nie zadziała. – Wildcard

12

Zakładam, że używasz psql, może to być przydatne, aby dodać do Twojego pliku ~/.psqlrc.

\set ON_ERROR_STOP on 

Spowoduje to przerwanie pierwszego błędu. Jeśli go nie posiadasz, nawet przy transakcji będzie on nadal wykonywał twój skrypt, ale wszystko zawiedzie do końca skryptu.

Prawdopodobnie chcesz skorzystać z transakcji, jak powiedział Paul. Co również można zrobić z psql --single-transaction ..., jeśli nie chcesz zmienić skryptu.

Więc kompletny przykład, z ON_ERROR_STOP w swojej .psqlrc:

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

Nawet jeśli transakcja się nie powiedzie, status wyjścia komendy psql nadal wynosi 0. –

+3

Rzeczywiście, nawet jeśli użyta jest '--jeden-transakcja', to' -v ON_ERROR_STOP = 1' jest nadal konieczne dla niezerowego statusu istniejącego – bitek

104

Myślę, że rozwiązanie, aby dodać następujące do .psqlrc jest daleki od doskonałości

\set ON_ERROR_STOP on 

istnieje wiele bardziej proste i wygodny sposób - użyj psql z parametrem:

psql -v ON_ERROR_STOP=1 

lepiej użyć również -X parametr wyłączający użycie pliku .psqlrc. Działa doskonale dla mnie

p.s. rozwiązanie znalezione w świetnym poście od Petera Eisentrauta. Dziękuję, Peter! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

+4

'-v ON_ERROR_STOP = ON 'działa również, przynajmniej z 9.2. Podejrzewam, że dowolny z [wariantów boolowskiego "true"] (http://www.postgresql.org/docs/9.2/static/datatype-boolean.html) jest dozwolony. – jpmc26

+0

Nie działa w trybie interaktywnym, co dezorientowało mnie przez chwilę. –

+0

Dzięki, dodawanie -v ON_ERROR_STOP = 1 -x działa dla mnie. – netto

Powiązane problemy