【问题标题】: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 子句传递。