Триггер отметки времени обновления Postgresql в унаследованной таблице - PullRequest
0 голосов
/ 25 сентября 2018

Я использовал этот пример , и он работал хорошо, когда все мои таблицы были в публичной схеме.

Но триггер не работал, так как я разделил таблицы на разные схемы и применил наследование.

Вот пример моей структуры:

CREATE SCHEMA common;
CREATE SCHEMA video;

CREATE TABLE common.file (
    file_id    SERIAL PRIMARY KEY,
    url        VARCHAR(255)                         NOT NULL,
    mime_type  VARCHAR(31) DEFAULT ''               NOT NULL,
    size       INTEGER                              NOT NULL,
    modified   TIMESTAMP DEFAULT CURRENT_TIMESTAMP  NOT NULL
);

CREATE TABLE video.file (
    width       INTEGER                 NOT NULL,
    height      INTEGER                 NOT NULL,
    local_path  VARCHAR(255) DEFAULT '' NOT NULL
)
INHERITS (common.file);

CREATE FUNCTION common.update_modified()
    RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    NEW.modified = now();
    RETURN NEW;
END;

CREATE TRIGGER update_modified 
   BEFORE UPDATE ON common.file 
FOR EACH ROW EXECUTE PROCEDURE common.update_modified();

Когда я делаю UPDATE common.file ... или UPDATE video.file ... поле common.file.modified не меняется само.Кажется, триггер не работает, но я не понимаю, почему.

Что я должен сделать, чтобы исправить поведение?

1 Ответ

0 голосов
/ 25 сентября 2018

В описанной проблеме триггер установлен только на common.file, поэтому UPDATE common.file ... не работает, если строка вставлена ​​в video.file

Документация гласит: INSERT всегда вставляется в точно указанную таблицу

Таким образом, триггер должен применяться как к common.file, так и к video.file.

-- Creating schemas and tables the same

-- Let function be in public scheme
CREATE FUNCTION update_modified()
    RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    NEW.modified = now();
    RETURN NEW;
END;

CREATE TRIGGER update_modified 
   BEFORE UPDATE ON common.file 
FOR EACH ROW EXECUTE PROCEDURE update_modified();

CREATE TRIGGER update_modified 
   BEFORE UPDATE ON video.file 
FOR EACH ROW EXECUTE PROCEDURE update_modified();

В том случае, когда мы обновляем строки, вставленные либо в common.file, либо в video.file вызовет соответствующий триггер.

...