#postgresql #triggers #plpgsql
#postgresql #триггеры #plpgsql
Вопрос:
У меня более 100 таблиц в базе данных PostgreSQL. Когда вставка или обновление происходит в любой таблице, мне нужно зафиксировать действие записи, скажем, вставить или обновить для записи среди.. Есть ли какой-нибудь способ, которым я могу справиться с этим в одном триггере, поскольку я считаю, что писать триггер для каждой отдельной таблицы было бы неправильно. может ли кто-нибудь помочь с этим
Комментарии:
1. Вы можете написать только одну триггерную функцию, если структура таблиц одинакова для того, что должна делать триггерная функция, но вы должны создать триггер, используя эту функцию для каждой таблицы. Вы могли бы использовать словарь для получения всех таблиц и создания
CREATE TRIGGER
инструкций из него, чтобы вам не приходилось писать его вручную для каждой таблицы.2. Вот хороший пример того, как реализовать то, что предлагает @stickybit, даже если структура таблиц не одинакова.
Ответ №1:
Как говорит @stickybit, вы можете использовать одну и ту же триггерную функцию, но вам придется создавать триггер для каждой таблицы; это правильный способ, не говоря уже о необходимости. Однако структуры таблиц не обязательно должны быть одинаковыми. Вы можете использовать row_to_json для захвата полной строки.
create or replace
function make_copyof_aiudr()
returns trigger
language plpgsql
as $
begin
insert into copyof(table_name, copy_date,action,row_data)
select TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME
, now()
, TG_OP
, case when TG_OP = 'INSERT'
then row_to_json(new.*)
else now_to_json(old.*)
end ;
return null;
end;
$;
См., например, fiddle .