Postgresql

PostgreSQL:使用自定義列自動更新 updated_at

  • January 19, 2018

以前,我會將多個表合併為一個並返回結果,但在許多表中我有相同的列名。這就是為什麼我決定在列名前加上表名。但這打破了我不得不自動更新我的updated_at專欄的觸發器。

這是我的功能:

CREATE OR REPLACE FUNCTION update_updated_at()
 RETURNS TRIGGER AS $$
 BEGIN
     NEW.updated_at = now();
     RETURN NEW;
 END;
 $$ language 'plpgsql';

我會添加一個觸發器,例如:

CREATE TRIGGER update_users_updated_at
 BEFORE UPDATE ON users
 FOR EACH ROW EXECUTE PROCEDURE update_updated_at();

但是現在我的專欄被命名了users_updated_at,這不起作用。我的問題是有什麼方法可以將列名傳遞給觸發器並更新傳遞的列,還是有其他我不知道的方法?

使用spi 模組moddatetime

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;

你的申請

所以這就是你需要的。

CREATE EXTENSION spi;

ALTER TABLE users ALTER timestamp_at SET DEFAULT now();

DROP TRIGGER IF EXISTS
 update_users_updated_at ON users;

CREATE TRIGGER mdt_users
 BEFORE UPDATE ON users
 FOR EACH ROW
 EXECUTE PROCEDURE moddatetime (timestamp_at);

引用自:https://dba.stackexchange.com/questions/158743