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)