创建触发器以更新在 PostgreSQL 上新插入的记录

Create Trigger to update the record that was newly inserted on PostgreSQL

我希望触发器在插入新记录时触发,并更新新插入的记录以添加当前日期和时间,需要帮助请善待这里 :(

这是我的代码:

函数:

CREATE OR REPLACE FUNCTION dbo.func_update_date_sync()
RETURNS trigger
LANGUAGE plpgsql
AS $BODY$
    BEGIN
        UPDATE dbo.rptowner SET date_sync = NOW()
        WHERE dbo.rptowner.owner_no = (SELECT MAX(dbo.rptowner.owner_no) FROM dbo.rptowner);
    RETURN NEW;
    END;
$BODY$
;

触发:

CREATE TRIGGER trg__update_date_sync 
AFTER INSERT
ON dbo.rptowner FOR EACH ROW EXECUTE PROCEDURE dbo.func_update_date_sync()

如果在创建新记录时只需要时间戳,则可以使用 NOW() 作为默认值。无需使用触发器。

ALTER TABLE dbo.rptowner ALTER COLUMN date_sync SET DEFAULT NOW();

你的 WHERE 条件不必要地复杂(而且很慢),因为你可以用 where owner_no = new.owner_no 替换它,因为你可以完全访问触发器中插入(或更新)的行。

但是,不需要昂贵的 UPDATE 语句。使用 BEFORE 触发器,并 将值分配给 新记录中的字段:

CREATE OR REPLACE FUNCTION dbo.func_update_date_sync()
RETURNS trigger
LANGUAGE plpgsql
AS $BODY$
BEGIN
  new.date_sync := now();
  RETURN NEW;
END;
$BODY$
;

并将触发器声明为 BEFORE 触发器:

CREATE TRIGGER trg__update_date_sync 
  BEFORE INSERT ON dbo.rptowner 
  FOR EACH ROW EXECUTE PROCEDURE dbo.func_update_date_sync()

附带说明:大多数人都不知道 now() is a synonym 对应 transaction_timestamp()。因此,在单个事务中插入或更新的所有行都将具有完全相同的 date_sync 值。如果这对你来说没问题,那么一切都很好。如果您希望每一行都有一个(稍微)不同的时间戳,您应该改用 clock_timestamp()