У меня есть база данных, которая содержит две таблицы:
create table data (
id char(5) primary key
);
create table update_log (
old_id char(5) primary key,
new_id char(5) not null,
update_date timestamp not null
)
Каждый раз, когда я обновляю строку в таблице data , я использую триггер для автоматической вставки записи в update_log .
create trigger trigger_update_log
after update on data
for each row
execute procedure udf_update_log();
create or replace function udf_update_log()
returns trigger
language plpgsql as
$$
begin
insert into update_log(old_id, new_id, update_date)
values (old.id, new.id, current_timestamp);
end;
$$;
И здесь возникает проблема: я хочу запретить пользователю вручную вставлять данные в update_log , поэтому я подумал о том, чтобы установить простой триггер, который просто выдвигает исключение, прежде чем я пытаюсь вставить в него. Проблема заключается в том, что триггер также блокирует вставки, сделанные с использованием триггера trigger_update_log . Как я могу запретить ручную вставку в таблицу, разрешив только trigger_update_log для вставки в update_log ? Я использую pgAdmin 4.
РЕДАКТИРОВАТЬ:
Я нашел решение! Я пишу это здесь на случай, если кому-то это понадобится. Я создал двух пользователей: суперпользователя (которому принадлежат таблицы, триггер и функцию, и которому разрешено вставлять в update_log ) и пользователя (которому нельзя вставлять вручную в update_log ). Чтобы пользователь мог вставить с помощью триггера, вы сначала дали ему разрешение на использование триггера (очевидно), а затем просто изменили код udf следующим образом:
create or replace function udf_update_log()
returns trigger
language plpgsql security definer as
$$
...
$$;
Теперь, когда пользователь запускает триггер, он будет запускать его с теми же разрешениями, что и у суперпользователя. Теперь пользователь может вставить в update_log , но только с помощью триггера!