我有一个简单的任务是将巨大的 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语句?
最好与USING的条款EXECUTE:
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
代替%s
for format()- 它还可以防御 SQL 注入尝试。
更多细节:
- 在触发器函数中使用动态表名进行 INSERT
- 如何在 PostgreSQL 8.2 中动态使用 TG_TABLE_NAME?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)