2017-11-29 3 views
1

부모 테이블과 여러 개의 상속 된 자식 테이블이 파티션으로 사용됩니다. 나는 수동으로 라우팅을 계산하고 각 INSERT, UPDATEDELETE 작업에 대한 처리가 필요하기 때문에 PG 10에서 새로운 방법을 사용하지 않습니다.PostgreSQL ON BEFORE DELETE 트리거가 상속 시나리오에서 부모 테이블에서 실행되지 않음

CREATE TRIGGER tg_collections_all 
    BEFORE UPDATE OR INSERT OR DELETE 
    ON cms.collections 
    FOR EACH ROW 
    EXECUTE PROCEDURE cms.collections_process(); 

그것은 화재 및 INSERTUPDATE에서 제대로 작동하지만 DELETE에 :

나는이 트리거를 가지고있다.

raise exception '(%)', TG_OP; 

행 삭제 :

나는 DELETE이 발사되지 증명하기 위해 cms.collections_process()에 선 # 1과 다음 줄을 추가했다.

docs 상태 :

이에

행 레벨 트리거는 영향을받는 모든 파티션 또는 하위 테이블 소성된다.

아이디어가 있으십니까?

답변

1

UPDATE s와 (당신이 ONLY를 지정하지 않은 경우)하지만, 트리거가 만에 트리거 테이블에 대해 직접 지시 데이터 수정에 의해 발사 될 자식 테이블의 행에 영향을 미칠 것 부모 테이블에 DELETE의 :

CREATE TABLE parent(id integer, val text); 
CREATE TABLE child() INHERITS (parent); 

CREATE OR REPLACE FUNCTION inh_trigger() RETURNS trigger 
    LANGUAGE plpgsql AS 
$$BEGIN 
    RAISE NOTICE 'Called by %', TG_OP; 
    RETURN CASE WHEN TG_OP = 'DELETE' THEN OLD ELSE NEW END; 
END;$$; 

CREATE TRIGGER inh_trigger BEFORE INSERT OR UPDATE OR DELETE ON parent 
    FOR EACH ROW EXECUTE PROCEDURE inh_trigger(); 

INSERT의 직접 parent 파일에 대한 트리거 :

test=> INSERT INTO parent VALUES (1, 'one'); 
NOTICE: Called by INSERT 
INSERT 0 1 
test=> INSERT INTO child VALUES (2, 'two'); 
INSERT 0 1 

동일 UPDATEDELETE에 대한 보유 :

test=> UPDATE parent SET val = 'changed' WHERE id = 1; 
NOTICE: Called by UPDATE 
UPDATE 1 
test=> UPDATE parent SET val = 'changed' WHERE id = 2; 
UPDATE 1 
test=> DELETE FROM parent WHERE id = 1; 
NOTICE: Called by DELETE 
DELETE 1 
test=> DELETE FROM parent WHERE id = 2; 
DELETE 1 

이것은 당신이 인용 문서의 문장에 직접 대조적 것 같다, 또는 적어도 문장은 매우 잘못된 것입니다.

이 문서는 버그이며, 이에 대해 불평해야합니다.

+0

문제는 특허에 대해 모든 명령을 실행하고 있지만 삭제 만 실행하는 것은 아니라는 것입니다. 그러나 그것은 어쨌든 아이에서 삭제됩니다. 트리거는 유일한 경로입니다. – IamIC

+1

나의 예제에서 보았 듯이'parent'를 업데이트해도 트리거는 실행되지 않지만 행은'child'에 있습니다. 모든 상속 자녀에 대해 트리거를 정의해야하는 것처럼 보입니다. –

+0

고맙습니다. 알겠습니다. PG는 레코드를 찾는 다른 방법이 없으므로 모든 하위 테이블을 검사해야합니다. 나는 다른 방법으로 접근해야한다고 생각한다 : 전용 UPDATE와 DELETE 함수를 가지고 이러한 함수에 대한 접근을 금지한다. – IamIC

관련 문제