继承表中的Postgresql更新时间戳触发器

时间:2018-09-25 10:24:54

标签: postgresql database-trigger

我使用了this example,当我所有的表都处于 public 模式时,它工作得很好。

但是自从我将表分成不同的模式并应用继承以来,触发器一直没有起作用。

以下是我的结构示例:

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 :(得分:0)

上述问题触发器仅在common.file上设置,因此如果在UPDATE common.file ...中插入行,则video.file不起作用

文档说: INSERT总是准确地插入到指定的表中

因此,触发器应同时应用于common.filevideo.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.filevideo.file中的行时,将调用相应的触发器。