Хранимая процедура для вставки новых записей в дочерние таблицы - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь создать хранимую процедуру для вставки новых записей в несколько дочерних таблиц (используя Greenplum). У меня есть основная таблица и набор дочерних таблиц. Я хотел бы вставить новые записи, которые есть в основной таблице, в дочерние таблицы (у меня около 20 дочерних таблиц). Я предполагаю, что я должен создать функцию, а затем триггер.

Обратите внимание, что я хочу вставить только некоторые поля в дочерние таблицы.

Я сделал несколько попыток, но вот последняя: (заранее извините, если выглядит очень плохо. Я никогда не создавал триггерных функций)

ФУНКЦИЯ:

CREATE OR REPLACE FUNCTION 
schema1.newcustomerdata() RETURNS trigger AS $new_customer_data$
BEGIN
    INSERT INTO schema1.customeridentifiers 
                (customer_id,
                date_time)
        SELECT NEW.customer_id,
                date_time 
        FROM schema1.customersmaster 
        ;
    RETURN NEW;
END;
$new_customer_data$ LANGUAGE plpgsql;

ПУСК:

CREATE  TRIGGER newcustomerdata 
AFTER INSERT ON schema1.customersmaster 
FOR EACH ROW EXECUTE PROCEDURE newcustomerdata();

Функция и триггер работают. Однако я больше не могу вставлять данные в основную таблицу. Я получаю это сообщение об ошибке:

функция не может быть выполнена в сегменте, поскольку она выдает невыбранный оператор

Итак, мои вопросы:

  • Каковы наилучшие решения для обновления дочерних таблиц?
  • Что не так с моей функцией или триггером?
  • Каковы ваши рекомендации?

1 Ответ

0 голосов
/ 03 сентября 2018

Очевидно, что «триггеры не поддерживаются, поскольку они обычно полагаются на использование функций VOLATILE». Используйте ПРАВИЛА вместо триггеров

CREATE RULE newcustomerdata  AS ON INSERT TO schema1.customersmaster 
DO also INSERT INTO schema1.customeridentifiers VALUES (NEW.customer_id, NEW.date_time);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...