2014-10-24 3 views
0

테이블에 레코드를 추가 할 때 다른 여러 테이블의 여러 레코드를 업데이트하는 트리거 함수를 포스트그레스에 작성하려고합니다.트리거를 사용하여 여러 테이블의 여러 레코드 업데이트

예를 들어 스키마 'survey'와 'a_household'라는 테이블이 있습니다.

이 스키마에는 세대 테이블의 ID를 참조하는 'hh_id'필드가있는 여러 테이블이 있습니다.

모든 테이블의 hh_id는 테이블의 다른 속성이 일치하는 경우에만 세대 테이블의 ID를 참조합니다. 나는 완전히 실패하고

DECLARE 
    tables text[] = ARRAY['b_member','f_firewood']; 
    table_name text; 
    r record; 
BEGIN 
    FOREACH table_name IN ARRAY tables 
    LOOP   
    INSERT INTO survey.table_name(hh_id) values (NEW.id) 
    SELECT * FROM survey.table_name 
    WHERE survey.table_name.a= NEW.b; 
    END LOOP; 
END; 

- 어떤 조언은 감사 : 같은

현재 나의 실패 코딩 보인다. (아래의 응답을 읽은 후)

내 두 번째 시도했다 :

DECLARE 
    tables text[] = ARRAY['b_member']; 
    table_name text; 

BEGIN 

if tg_op='INSERT' then 

FOREACH table_name IN ARRAY tables 
    LOOP  
    EXECUTE 'UPDATE ' || 'survey.' || table_name || ' SET hh_id = '||NEW.id||' FROM household.a_household WHERE (select survey.b_member.odk_parentkey from survey.b_member 
     where survey.b_member.odk_key = "'||NEW.odk_key||'");'; 

    END LOOP; 

end if; 

return new; 

END; 

하지만 난 오류 메시지 '열'HGD는 '존재하지 않는 반환하고 있습니다. NEW.odk_key의 값입니다. 베키

답변

1
CREATE OR REPLACE FUNCTION survey.insert_in_other_tables() 
    RETURNS trigger AS 
$BODY$ 
declare tables text[] = ARRAY['b_member','f_firewood']; 
table_name text; 

BEGIN 

if tg_op='INSERT' then 

FOREACH table_name IN ARRAY tables 
    LOOP  
    EXECUTE 'INSERT INTO ' || 'survey.' || table_name || '(hh_id) values ('||NEW.id||');'; 
    END LOOP; 

end if; 

return new; 

end;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
관련 문제