Триггер, который будет строить одну строку из нескольких строк - PullRequest
0 голосов
/ 19 ноября 2018

Я имею в виду:

INSERT INTO test VALUES(1, 'message'), (2, 'message'), (3, 'message);

запуск приведет к тому, что результат в таблице будет выглядеть так:

1, E'message\nmessage\nmessage'

Как запретить вставку строк, а затем продолжить операции с перенесенными данными во вставке? Я использую postresgql.

1 Ответ

0 голосов
/ 20 ноября 2018

В Postgres 10+ вы можете использовать таблицу переходов в триггере AFTER, см. Пример 43.7. Аудит с таблицами переходов . Предполагая, что id является первичным ключом (или уникальным):

create table my_table(id int primary key, message text);

Вы можете обновить одну и удалить оставшиеся вставленные строки:

create or replace function after_insert_on_my_table()
returns trigger language plpgsql as $$
declare r record;
begin
    select 
        array_agg(id) as ids, 
        array_to_string(array_agg(message), e'\n') as message
    from new_table
    into r;

    update my_table
    set message = r.message
    where id = r.ids[1];

    delete from my_table
    where id = any(r.ids[2:]);

    return null;
end $$;

В определении триггера объявите таблицу переходов (как new_table):

create trigger after_insert_on_my_table
after insert on my_table
referencing new table as new_table
for each statement 
execute procedure after_insert_on_my_table();

В более ранних версиях Postgres вы можете имитировать таблицу переходов , представленную в Postgres 10.

Проверьте это в db <> скрипке.

...