在 PostgreSQL 中的所有 last_modified 列上创建触发器

mat*_*boy 7 postgresql trigger row-modification-time

在 PostgreSQL 9.5 中,我有表格中的列

prefix_last_modified timestamp without time zone NOT NULL DEFAULT  (clock_timestamp() AT TIME ZONE 'UTC')
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来设置在每次更新行时自动更新的最后修改的值,我发现这篇定义函数的好帖子

CREATE OR REPLACE FUNCTION update_modified_column() 
RETURNS TRIGGER AS $$
BEGIN
    NEW.modified = now();
    RETURN NEW; 
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

现在,我想知道是否有任何方法可以将列名传递给 PostgreSQL 函数并将其执行到NEW行?例如

CREATE OR REPLACE FUNCTION update_modified_column(varchar column)   
    RETURNS TRIGGER AS $$
    BEGIN
        NEW.column = now();
        RETURN NEW; 
    END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 10

spi 模块: moddatetime

moddatetime - 用于跟踪上次修改时间的函数

moddatetime()是将当前时间存储到timestamp字段中的触发器。这对于跟踪表中特定行的最后修改时间很有用。

要使用,请BEFORE UPDATE使用此函数创建触发器。指定单个触发器参数:要修改的列的名称。该列的类型必须是时间戳或带时区的时间戳。

moddatetime.example 中有一个例子。

示例/概要

从上面引用的文件中

DROP TABLE mdt;

CREATE TABLE mdt (
    id      int4,
    idesc       text,
    moddate timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL
);

CREATE TRIGGER mdt_moddatetime
    BEFORE UPDATE ON mdt
    FOR EACH ROW
    EXECUTE PROCEDURE moddatetime (moddate);

INSERT INTO mdt VALUES (1, 'first');
INSERT INTO mdt VALUES (2, 'second');
INSERT INTO mdt VALUES (3, 'third');

SELECT * FROM mdt;

UPDATE mdt SET id = 4
    WHERE id = 1;
UPDATE mdt SET id = 5
    WHERE id = 2;
UPDATE mdt SET id = 6
    WHERE id = 3;

SELECT * FROM mdt;
Run Code Online (Sandbox Code Playgroud)

你的申请

所以这就是你需要的。

CREATE EXTENSION moddatetime;

CREATE TRIGGER mdt_table
  BEFORE UPDATE ON table
  FOR EACH ROW
  EXECUTE PROCEDURE moddatetime (prefix_last_modified);
Run Code Online (Sandbox Code Playgroud)

  • “CREATE EXTENSION moddatetime;”对我有用,而不是“CREATE EXTENSION spi;”。 (2认同)