【问题标题】:Access table field on creating a trigger postgresql在创建触发器 postgresql 时访问表字段
【发布时间】:2014-06-19 08:16:22
【问题描述】:

如何在创建触发器时访问表字段?

CREATE TRIGGER foo_trigger
AFTER INSERT OR UPDATE OR DELETE ON foo
FOR EACH ROW EXECUTE PROCEDURE proc(foo.field);//here goes the parameter

【问题讨论】:

标签: sql postgresql triggers plpgsql dynamic-sql


【解决方案1】:

触发器的参数始终是一个字符串——所以你不能在那里使用 SQL 标识符。但是您可以使用字符串作为名称并使用动态 SQL 来访问请求的字段:

CREATE TABLE foo(a int, b int);

CREATE OR REPLACE FUNCTION public.foo_update_trg()
RETURNS trigger LANGUAGE plpgsql
AS $function$
DECLARE t text;
BEGIN
  EXECUTE format('SELECT $1.%I', TG_ARGV[0]) INTO t USING old; 
  RAISE NOTICE 'original value of "%" is "%"', TG_ARGV[0], t;
  RETURN NULL;
END;
$function$

CREATE TRIGGER foo_update_trigger_a AFTER UPDATE ON foo FOR EACH ROW 
   EXECUTE PROCEDURE foo_update_trg('a');
CREATE TRIGGER foo_update_trigger_b AFTER UPDATE ON foo FOR EACH ROW
   EXECUTE PROCEDURE foo_update_trg('b');

INSERT INTO foo VALUES(10,20);
UPDATE foo SET a = 20, b = 40;

重要的是线

EXECUTE format('SELECT $1.%I', TG_ARGV[0]) INTO t USING old;

它是动态SQL(plpgsql语句EXECUTE)和字符串格式化函数(函数格式)的使用。首先,我们准备一个字符串“SELECT $1.a”~,它是对第一个动态 SQL 参数的字段“a”的引用,我们将此字符串评估为查询 - 此查询的参数通过 USING 子句传递。

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2017-05-11
    • 1970-01-01
    • 2014-05-09
    相关资源
    最近更新 更多