gpt4 book ai didi

postgresql - 从通用触发器中的不同列获取值

转载 作者:行者123 更新时间:2023-11-29 12:05:11 26 4
gpt4 key购买 nike

我是 PostgreSQL 的新手,发现了一个触发器,除了一件小事外,它完全符合我的目的。触发器非常通用,跨不同的表运行并记录不同的字段更改。我找到了 here .

我现在需要做的是测试特定字段,该字段会随着触发触发器的表的变化而变化。我想到了使用 substr 因为所有列都将具有相同的名称格式,例如XXX_cust_no 但 XXX 可以更改为 2 或 4 个字符。我需要在 XXX_cust_no 字段中记录写入 history_/audit 表的每条记录的值。使用一堆 IF/ELSE 语句来完成这个不是我想做的事情。

触发器现在可以记录 table_namecolumn_nameold_valuenew_value。但是,我还需要记录已更改记录的 XXX_cust_no

最佳答案

基本上,您需要动态 SQL 来获取动态列名。 format 有助于格式化 DML 命令。使用 USING 子句从 NEWOLD 传递值。

给定这些表:

CREATE TABLE tbl (
t_id serial PRIMARY KEY
,abc_cust_no text
);

CREATE TABLE log (
id int
,table_name text
,column_name text
,old_value text
,new_value text
);

它可以像这样工作:

CREATE OR REPLACE FUNCTION trg_demo()
RETURNS TRIGGER AS
$func$
BEGIN

EXECUTE format('
INSERT INTO log(id, table_name, column_name, old_value, new_value)
SELECT ($2).t_id
, $3
, $4
,($1).%1$I
,($2).%1$I', TG_ARGV[0])
USING OLD, NEW, TG_RELNAME, TG_ARGV[0];

RETURN NEW;

END
$func$ LANGUAGE plpgsql;

CREATE TRIGGER demo
BEFORE UPDATE ON tbl
FOR EACH ROW EXECUTE PROCEDURE trg_demo('abc_cust_no'); -- col name here.

SQL Fiddle.

dba.SE 上的相关回答:

List of special variables visible in plpgsql trigger functions in the manual.

关于postgresql - 从通用触发器中的不同列获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26354558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com