【发布时间】:2021-12-21 11:59:15
【问题描述】:
我正在尝试创建一个将新记录动态插入审计表的触发器函数。
CREATE OR REPLACE FUNCTION schema.table()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
_tablename text;
BEGIN
_tablename := 'user_audit';
EXECUTE 'INSERT INTO audit.' || quote_ident(_tablename) || ' VALUES ($1.*)' USING OLD;
RETURN NEW;
END;
$BODY$;
上面的触发器功能可以正常工作,因为它可以将 OLD 中的所有内容按预期插入到审计表中。但是,我的表中有一个名为 timestampzt_range 的 tstzrange 范围列,我需要做的是使用 LOWER(OLD.timestampzt_range)、LOWER(NEW.timestampzt_range) 在审计表中为其设置值。如果我想在多个表上使用此触发器函数,如何在不使用如下插入语句的情况下动态实现这一点。
INSERT INTO audit.user_audit
(
column_1,
column_2,
timestampzt_range
)
VALUES
(
OLD.column_1,
OLD.column_2,
tstzrange(LOWER(OLD.timestampzt_range), LOWER(NEW.timestampzt_range))
);
我只需要在更新时使用它,如果我可以实现动态语句,表名将作为参数传递给触发函数。只有审计列在整个数据库中是一致的,所以对我来说重要的是使用 OLD 创建插入或以某种方式动态地从中提取除 timestampzt_range 之外的所有内容,然后使用 tstzrange(LOWER(OLD.timestampzt_range), LOWER(NEW.timestampzt_range)) 作为范围列的值。
【问题讨论】:
标签: postgresql triggers range