Создание процедуры копирования для триггера - PullRequest
0 голосов
/ 07 января 2019

Я устанавливаю триггеры в PostgreSQL, и я не уверен, как сделать определенные случаи. Например, я настроил таблицы фильмов, и некоторые конечные точки изменяют любую часть, чтобы она создавала точную копию, если строка редактировалась до изменения, и сохраняю ее в films_log. А также, если меняются несколько строк, мне нужно, чтобы эти строки тоже регистрировались.

CREATE TABLE films (
  id          integer PRIMARY KEY,
  title       varchar(40) NOT NULL,
  did         integer NOT NULL,
  date_prod   date,
  kind        varchar(10)
);


CREATE TABLE films_log (
  serial      integer,
  title       varchar(200),
  did         integer,
  date_prod   date,
  kind        varchar(200)
);

CREATE TRIGGER films_logging_trigger 
  BEFORE UPDATE ON myschema.films 
  FOR EACH ROW EXECUTE PROCEDURE films_logging();

Что я пробовал:

CREATE OR REPLACE FUNCTION films_logging() RETURNS trigger
            LANGUAGE plpgsql
            AS $$
            BEGIN
            INSERT INTO films_log (id, title, did, date_prod, kind)
            SELECT id, title, did, date_prod, kind FROM films WHERE id = OLD.id
            END;
            $$;

1 Ответ

0 голосов
/ 07 января 2019

Функции триггера имеют для возврата строки. В триггере before это обычно строка new.

Вам также не нужен SELECT, использование значений из строки old напрямую более эффективно:

CREATE OR REPLACE FUNCTION films_logging() RETURNS trigger
  LANGUAGE plpgsql
AS $$
BEGIN
  INSERT INTO films_log (id, title, did, date_prod, kind)
  values (old.id, old.title, old.did, old.date_prod, old.kind);

  return new; --<< here
END;
$$;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...