【问题标题】:Get values from varying columns in a generic trigger从通用触发器中的不同列获取值
【发布时间】:2015-02-27 09:19:17
【问题描述】:

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

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

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

【问题讨论】:

标签: postgresql triggers plpgsql dynamic-sql


【解决方案1】:

基本上,动态列名需要动态 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多