shellscript 활동을 사용하여 AWS Datapipeline을 통해 postgressql DB에 연결하고 있습니다. 60 개 테이블의 데이터를 삭제하고 파일에서 테이블로 데이터를 복사해야합니다. 복사 작업이 실패하면 테이블이 비어 있지 않도록 테이블을 이전 상태로 롤백하고 싶습니다. 아래와 같이 여러 개의 psql 문으로 수행하려고하는데 롤백이 예상대로 작동하지 않습니다. 파일 중 하나에 오류가 발생하고 문을 복사하지 못하면 테이블이 삭제되고 비어 있습니다. 그러나 이전 상태로 롤백하고 싶습니다.
'psql -h $2 -d $3 -U $4 -p $7 -c "BEGIN;"
psql -h $2 -d $3 -U $4 -p $7 -c "Delete from $var1;"
psql -h $2 -d $3 -U $4 -p $7 -c "\COPY $var1 FROM '$f' csv header;"
VAR3=$?
echo "$VAR3"
if [ $VAR3 -gt 0 ];
then
psql -h $2 -d $3 -U $4 -p $7 -c "ROLLBACK;"
else
psql -h $2 -d $3 -U $4 -p $7 -c "COMMIT;"
fi
psql -h $2 -d $3 -U $4 -p $7 -c "END;"'
다음은 복사 명령이 오류를 반환했을 때의 표준 출력 로그입니다.
BEGIN DELETE 560 1 롤백 커밋
Begin, Delete 문 및 복사로 트랜잭션을 시작합니다. 복사가 실패하면 롤백하는 논리를 작성하고 그렇지 않으면 커밋하고 종료합니다. 여기서 무엇이 잘못 되었습니까?
각 psql
호출은 자체 데이터베이스 연결을 만듭니다. 그러나 데이터베이스 트랜잭션은 항상 단일 데이터베이스 연결의 일부이므로 한 psql
호출 에서 트랜잭션을 시작하고 다른 호출에서 종료 할 수 없습니다 . 하나.
"여기 문서"를 사용합니다.
psql <<EOF
BEGIN;
...
COMMIT;
EOF
조건부 처리를 위해 \if
최신 psql
버전 의 기능을 사용할 수 있습니다 .
여기 문서에 탭 문자가 없는지 확인하십시오. 놀라운 동작을 유발할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다