2015-06-19 5 views
0

Я новичок в PostgreSQL, и я пытаюсь создать триггер для обновления. У меня есть два источника и места для таблиц с одинаковой структурой таблицы. Поэтому я хочу, чтобы записи обновлялись по назначению, когда есть обновление по источнику. Я попытался ниже триггерную функцию:Update trigger on postgresql

Create FUNCTION ins_functiontest() RETURNS trigger AS ' 
BEGIN 
IF tg_op = ''UPDATE'' THEN 
    INSERT INTO destination(id,name,tg_op) 
    VALUES (new.id,new.name, tg_op); 
     RETURN new; 
    END IF; 
END 
' LANGUAGE plpgsql; 

Column «ID» является первичным ключом на обеих таблицах, поэтому данная функция не может, когда есть обновление на источнике, как запись уже существует в пункт назначения.

Я попытался изменить функцию, чтобы обновить остальную часть столбцов в таблице, сравнивая поля идентификатора источника и адресата.

Update des 
     Set name = new.name,tg_op= update 
     From destination des join source src 
     ON des.id = src.id 
     Where des.id = src.id 

Но не удалось получить синтаксис правильно. Любая помощь будет оценена по достоинству.

Я использую PostgreSQL 8.4.

+0

Для того чтобы функция обрабатывалась как функция триггера, вам необходимо выдать конкретный оператор 'CREATE TRIGGER'. – mic4ael

ответ

-1

Я сделал что-то подобное для журнальных столов. Но я дублирую колоны. 1 для нового. * Для улавливания вставки и обновления и набора для старого. * Также для обновления и удаления. Затем вставлен первичный ключ сериализации, время и idtransaction, txid_current(). Единственным доказательством пули является серийный номер. Идентификация зависит от работы сервера. Если вы измените pc, и это может произойти в течение жизни db, он снова запустит счетчик. Но не может случиться, что две транзакции с одним и тем же идентификатором имеют одинаковое время. Но возможны две транзакции одновременно. Особенно, если у вас несколько пользователей. подключено

+0

Спасибо, сударь за ваш ответ. к сожалению, в моем сценарии я не могу дублировать столбцы. Я решил решить проблему. Отправьте решение здесь, если кому-то это понадобится. Создать FUNCTION ins_functiontest() возвращает триггер ' НАЧАТЬ IF tg_op = '' UPDATE'»THEN Update stg_auth_group SET имя = new.name, Где ID = new.id; END IF; END 'LANGUAGE plpgsql; – Sam

0

Я понял решение для своей проблемы, Ниже приведен ответ. Создать FUNCTION ins_functiontest() возвращает триггер ' НАЧАТЬ IF tg_op = '' UPDATE'»THEN Update destination_table_name SET имя = new.name, Где ID = new.id;

END IF; END 'LANGUAGE plpgsql;