오류가 발생하면 Postgres 스크립트를 중지하려면 어떻게해야합니까?


95

SQL 스크립트를 실행할 때 스크립트에서 첫 번째 오류가 발생하면 중지되고 일반적으로 이전 오류에 관계없이 계속되도록 지정하는 방법이 있습니까?

답변:


156

.psqlrc에 다음을 추가하는 솔루션은 완벽하지 않다고 생각합니다.

\set ON_ERROR_STOP on

훨씬 더 간단하고 편리한 방법이 있습니다. 매개 변수와 함께 psql을 사용하십시오.

psql -v ON_ERROR_STOP=1

또한 사용하는 것이 더 좋습니다 -X.psqlrc 파일 사용을 끄는 매개 변수 . 나를 위해 완벽하게 작동

ps는 Peter Eisentraut의 훌륭한 게시물에서 찾은 솔루션입니다. 고마워요, 피터! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html


8
-v ON_ERROR_STOP=ON적어도 9.2에서 작동합니다. 부울 "true"변형 이 허용되는 것 같습니다.
jpmc26

대화 형 모드에서는 작동하지 않아 잠시 혼란 스러웠습니다.
Sam Watkins 2015

21

나는 당신이 사용 psql하고 있다고 가정합니다 . 이것은 ~/.psqlrc파일 에 추가하는 것이 편리 할 것 입니다.

\set ON_ERROR_STOP on

이렇게하면 첫 번째 오류에서 중단됩니다. 가지고 있지 않다면 트랜잭션이 있어도 스크립트를 계속 실행하지만 스크립트가 끝날 때까지 모든 것을 실패합니다.

그리고 아마도 Paul이 말한 것처럼 트랜잭션을 사용하고 싶을 것입니다. psql --single-transaction ...스크립트를 변경하지 않으려는 경우 에도 수행 할 수 있습니다 .

따라서 .psqlrc에 ON_ERROR_STOP이있는 완전한 예 :

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

2
트랜잭션이 실패하더라도 psql 명령의 종료 상태는 여전히 0입니다.
Dr. Person Person II

4
사실, 경우에도 --single-transaction사용되며, -v ON_ERROR_STOP=10이 아닌 존재의 상태를 여전히 필요하다
bitek

8

정확히 원하는 것은 아니지만 스크립트를 시작 begin transaction;하고로 끝나는 end transaction;경우 실제로 첫 번째 오류 이후의 모든 것을 건너 뛴 다음 오류 이전에 수행 한 모든 작업을 롤백합니다.


사실이지만 여전히 모든 것을 구문 분석합니다. 첫 번째 트랜잭션이 성공한 경우에만 두 번째 트랜잭션 을 수행 하려면 작동하지 않습니다.
Wildcard

예, DDL Create table 오류가 발생하면 계속하는 것을 잊지 마십시오 ... (버전 : postrgres 10). 예, 한 테이블을 건너 뛰고 다른 테이블로 이동합니다 ...
JL Peyret

0

저는 항상 매뉴얼을 직접 참조하고 싶습니다.

로부터 PostgreSQL의 설명서 :

종료 상태

psql이 정상적으로 완료되면 셸에 0을 반환하고, 자체 치명적인 오류 (예 : 메모리 부족, 파일을 찾을 수 없음)가 발생하면 1, 서버에 대한 연결이 잘못되어 세션이 대화 형이 아닌 경우 3, 스크립트에서 오류가 발생했으며 ON_ERROR_STOP 변수가 설정되었습니다.

기본적으로 PostgreSQL 서버에서 실행중인 SQL 코드 오류 psql은 오류를 종료하지 않습니다. 오류를 포착하고 계속합니다. 위에서 언급했듯이 ON_ERROR_STOP설정을 on으로 설정하면 psql이 SQL 코드에서 오류를 발견하면 종료하고 3셸로 돌아갑니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.