如何在Postgresql中获取组合old.variablename的列数据



我正在尝试构建一个审计触发器函数(适用于多个表(,用于检索表主键的列。例如,有一个表客户将"customerid"作为主键,有一个表订单将"orderid"作为主键。

有了这个,我找到了触发函数的表的列/主键的名称,并将其存储在"prim"中。

prim :=(SELECT c.column_name
    FROM information_schema.key_column_usage AS c
    LEFT JOIN information_schema.table_constraints AS t
    ON t.constraint_name = c.constraint_name
    WHERE(t.table_name = TG_TABLE_NAME) AND t.constraint_type = 'PRIMARY 
KEY');

这确实有效。Prim 的字面意思是"orderid"或"customerid",具体取决于哪个表触发了函数。现在,我要做的是获取我检索的列的信息,并将其插入到审计表中。因此,假设我从客户表中删除了一行,我想在审核表中插入该事件。我尝试做:

INSERT INTO audit(columnname,dataincolumn,tablename)
VALUES(prim,old.prim,tg_table_name);

我知道它有很多问题,但是我怎样才能让我的输出是:

COLUMN     DATAINCOLUMN    TABLE
--------------------------------
customersid    12     Customers
orderid        23     Orders

我收到以下错误:

ERROR:  record "old" has no field "prim"

这有点棘手,但您可以使用动态 SQL 并将值转换为正确的类型。

假设您有一个bigint变量val(或integer,具体取决于您的需求(,您可以执行以下操作:

EXECUTE format('SELECT (($1)::%I).%I', TG_TABLE_NAME, prim)
INTO val
USING OLD;

最新更新