访问表字段创建触发器postgresql

时间:2014-05-02 15:24:59

标签: sql postgresql triggers plpgsql dynamic-sql

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

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

1 个答案:

答案 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子句传递。