Триггер в БД Postgres - PullRequest
       9

Триггер в БД Postgres

1 голос
/ 27 июля 2011

Какой самый эффективный способ создания этого триггера в Postgres.

Ниже я приведу очень упрощенный пример того, что мне нужно для моих целей, но он основан на той же концепции.

Учтите, у нас есть схема, определенная ниже:

CREATE TABLE items (
  item_id int4,
  part_no int4,
  description text);

CREATE TABLE blacklist (
  part_no int4,
  reason text);

CREATE TABLE matches (
  item_id int4,
  part_no int4,
  reason text);

Затем, каждый раз, когда добавляется новый элемент, мы проверяем, есть ли он в черном списке (сравнивая part_no), и если онесть, мы создаем новую запись в таблице соответствий.

1 Ответ

2 голосов
/ 27 июля 2011

Вы бы хотели триггер до или после вставки на items:

create trigger blacklist_matches after insert on items
for each row execute procedure check_blacklist();

Тогда функция check_blacklist будет выглядеть примерно так:

create function check_blacklist()
    returns trigger as $$
begin
    insert into matches (item_id, part_no, reason)
    select NEW.item_id, NEW.part_no, blacklist.reason
    from blacklist
    where blacklist.part_no = NEW.part_no;
    return null;
end;
$$ language plpgsql;

Забавно выглядящий $$, более или менее, является SQL-версией heredoc.

Это оборачивает проверку "есть ли в черном списке" и вставку matches в один простой бит SQL. Переменная NEW в триггере является ссылкой на новую строку, с которой вы работаете. Если NEW.part_no не соответствует чему-либо в blacklist, то SELECT ничего не выдаст и INSERT не будет выполнен.

Предположительно, у вас будет индекс на blacklist.part_no (который в любом случае выглядит как ПК), поэтому вышеприведенное должно быть достаточно быстрым.

Документация PostgreSQL довольно хорошая и содержит целый раздел хранимых процедур и триггеров , если вам нужна ссылка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...