postgresql 如何在触发器函数中将NEW.* 传递给EXECUTE

dced5bon  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(87)

我有一个简单的使命是将巨大的MD5值插入到表(分区表)中,并创建了一个触发器和一个触发器函数来代替INSERT操作。在函数中,我检查了NEW.md5的前两个字符,以确定应该插入哪个表。

DECLARE
  tb text;
BEGIN
  IF TG_OP = 'INSERT' THEN
    tb = 'samples_' || left(NEW.md5, 2);
    EXECUTE(format('INSERT INTO %s VALUES (%s);', tb, NEW.*)); <- WRONG
  END IF;
  RETURN NULL;
END;

问题是如何将NEW.*连接到SQL语句中?

zvms9eto

zvms9eto1#

最好使用EXECUTEUSING子句:

CREATE FUNCTION foo ()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
  IF TG_OP = 'INSERT' THEN
     EXECUTE format('INSERT INTO %I SELECT $1.*'
                  , 'samples_' || left(NEW.md5, 2);
     USING NEW;
  END IF;
  RETURN NULL;
END
$func$;

EXECUTE不需要括号。
您也知道,除非在必要的地方引用,否则标识符将折叠为小写:格式说明符%I,而不是format()%s-这也可以防御SQL注入尝试。
更多详情:

相关问题