문제

데이터베이스 스키마 업데이트를 적용하는 스크립트 작업을하고 있습니다. 시작 트랜잭션/커밋을 사용하여 모든 SQL 업데이트 스크립트를 설정합니다. 이 스크립트를 명령 줄에서 PSQL로 전달합니다.

이제 동시에 여러 스크립트를 적용하고 한 번의 거래에 적용해야합니다. 지금까지 제가 생각해 낸 유일한 솔루션은 원래 스크립트 세트에서 시작 트랜잭션/커밋을 제거한 다음 새로운 시작 트랜잭션/커밋 블록 안에 함께 잼하는 것입니다. 나는 이것을 즉석에서 할 수 있도록 Perl 스크립트를 작성하고 있습니다.

효과적으로 나는 중첩 된 거래를 원합니다. PostgreSQL에서 수행하는 방법을 알 수 없습니다.

이 목적을 위해 중첩 거래를 수행하거나 시뮬레이션 할 수있는 방법이 있습니까? 오류에 대해 자동으로 구제 할 것을 설정할 수 있으므로 낮은 트랜잭션이 실패하면 최상위 거래를 계속할 필요가 없습니다.

도움이 되었습니까?

해결책

SavePoints를 사용하여 PostgreSQL 내에서 중첩 트랜잭션을 사용할 수 있습니다.

이 코드 예를 들어보세요 :

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

어쩌면 이것은 당신을 조금 도움이 될 것입니다.

다른 팁

나는 밴드에서 내 문제를 '해결'했다 - 나는 perl 스크립트를 사용하여 입력 스크립트를 재 작업하여 시작 트랜잭션/커밋 호출을 제거한 다음 하나의 파일로 푸시하여 자체 시작 트랜잭션을 얻는다. 저지르다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top