继承 table 中的 Postgresql 更新时间戳触发器
Postgresql update timestamp trigger in inherited table
我使用了 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
不会自行更改。好像触发器没有运行,但我不明白为什么。
我应该怎么做才能修复该行为?
所描述的问题触发器仅在 common.file
上设置,因此如果在 video.file
中插入行,UPDATE common.file ...
将不起作用
文档说:INSERT 总是准确地插入到指定的 table 中
所以触发器应该应用于 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
中插入的行时,将调用相应的触发器。
我使用了 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
不会自行更改。好像触发器没有运行,但我不明白为什么。
我应该怎么做才能修复该行为?
所描述的问题触发器仅在 common.file
上设置,因此如果在 video.file
UPDATE common.file ...
将不起作用
文档说:INSERT 总是准确地插入到指定的 table 中
所以触发器应该应用于 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
中插入的行时,将调用相应的触发器。