2016-06-30 4 views
0

트랜잭션을 기반으로 PostgreSQL에서 트리거를 강제로 실행할 수 있는지 궁금합니다.Postgres 트리거 전체 트랜잭션 및 각 업데이트 작업에 대한 실행하지

(for 루프 내에서) 파이썬 스크립트의 레코드를 업데이트 중입니다. 업데이트 작업시 테이블에 레코드를 삽입하는 트리거가 있습니다. 이제 전체 트랜잭션을 기반으로 한 레코드 만 삽입하고 파이썬 스크립트 내에서 업데이트하는 모든 레코드는 삽입하지 않습니다.

이 방법을 사용할 수 있습니까?

+0

BEGIN과 COMMIT 사이에 업데이트 문이 많은 경우이 문구를 한 번만 호출하려고합니다. 이러한 시나리오를 감지 할 수있는 방법이 있습니까? – akashag26

답변

0

그것은 조금 투박하지만 당신은 조건부 트리거를 사용하여이 작업을 수행 할 수

CREATE TRIGGER t 
AFTER UPDATE ON MyTable 
FOR EACH ROW 
WHEN (IsFirstCallForThisTransaction()) 
EXECUTE PROCEDURE MyTrigger(); 

까다로운 비트 IsFirstCallForThisTransaction()을 정의한다. 내부적으로는 플래그를 어딘가에 설정해야하지만이 플래그가 현재 트랜잭션에 적용되도록 보장해야합니다.

하나의 옵션은 SET LOCAL을 사용하여 custom configuration variable을 할당하는 것입니다.

ALTER DATABASE MyDB SET my_vars.trigger_called_in_current_transaction = false; 

그런 다음 함수가 다음과 같이 보일 것입니다 : 문제의 데이터베이스에

my_vars.trigger_called_in_current_transaction = false 

또는 대안은 디폴트를 첨부 :이 라인 서버의 postgresql.conf 파일을 넣어이 변수를 초기화 할 수

CREATE FUNCTION IsFirstCallForThisTransaction() RETURNS BOOLEAN AS 
$BODY$ 
BEGIN 
    IF current_setting('my_vars.trigger_called_in_current_transaction')::boolean THEN 
    RETURN false; 
    ELSE 
    SET LOCAL my_vars.trigger_called_in_current_transaction TO true; 
    RETURN true; 
    END IF; 
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE;