postgresql 触发器,用于在第一个表中执行任何操作后将记录插入另一个表

6ovsh4lw  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(46)

我有一个名为car的表。我如何在 PostgreSQL 中挂载一个 * 触发器 *,其中该表中的每个 * 插入/更新/删除 * 都跟随着这样的记录到另一个表中的 * 插入 *?这些表的结构几乎相同,但第二个表car2将没有PK列,因为同一条记录可以在那里插入多次 * 更新 * 在car中,还有一个带有 timestamp 的附加列,它将反映记录插入时的日期时间。

Car
ID  [PK]
Name
Location

Car2
ID
Name
Location
InsertionDate

字符串

mqkwyuun

mqkwyuun1#

正如在评论中提到的,文档中有一个例子-你可以把它复制粘贴到你的结构上。Demo at db<>fiddle:

create table car(
id int generated by default as identity primary key,
name text,
location text);

create table car_audit(
operation char(1) NOT NULL,
stamp     timestamp NOT NULL,
userid    text      NOT NULL,
id int,
name text,
location text);

CREATE OR REPLACE FUNCTION trf_process_car_audit() RETURNS TRIGGER AS $car_audit$
    BEGIN
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO car_audit SELECT 'D', now(), current_user, OLD.*;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO car_audit SELECT 'U', now(), current_user, NEW.*;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO car_audit SELECT 'I', now(), current_user, NEW.*;
        END IF;
        RETURN NULL;
    END;
$car_audit$ LANGUAGE plpgsql;

CREATE TRIGGER tr_car_audit
AFTER INSERT OR UPDATE OR DELETE ON car
    FOR EACH ROW EXECUTE FUNCTION trf_process_car_audit();

个字符
| 操作|邮票|userId| ID|名称|位置|
| --|--|--|--|--|--|
| 我|2023-12-13 11:47:00.364852| Postgres| 1 |本田|巴黎|
| U| 2023-12-13 11:47:00.364852| Postgres| 1 |现代|巴黎|
| D| 2023-12-13 11:47:00.364852| Postgres| 1 |现代|巴黎|

相关问题