2014-10-24 8 views
0

Я пытаюсь написать триггерную функцию в postgres, которая будет обновлять несколько записей в нескольких других таблицах при добавлении записи в таблицу.Обновление нескольких записей в нескольких таблицах с помощью триггера

Например, у меня есть «обзор» схемы и таблица под названием «a_household».

В этой схеме есть несколько таблиц с полем «hh_id», которые ссылаются на идентификатор домашней таблицы.

hh_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 Becky

ответ

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; 
Смежные вопросы