如何在创建触发器时访问表字段?
CREATE TRIGGER foo_trigger
AFTER INSERT OR UPDATE OR DELETE ON foo
FOR EACH ROW EXECUTE PROCEDURE proc(foo.field);//here goes the parameter
答案 0 :(得分:3)
Trigger的参数始终是一个字符串 - 因此您不能在那里使用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子句传递。