Как я могу отрицать ручную вставку в таблицу? - PullRequest
1 голос
/ 09 марта 2020

У меня есть база данных, которая содержит две таблицы:

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 , но только с помощью триггера!

...