如何在触发器函数中将 NEW.* 传递给 EXECUTE
How to pass NEW.* to EXECUTE in trigger function
我有一个简单的任务是将巨大的 MD5 值插入 tables(分区 table),并创建了一个触发器和一个触发器函数来代替 INSERT
操作.在函数中,我检查了 NEW.md5
的前两个字符以确定应该插入哪个 table。
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 语句中?
CREATE FUNCTION foo ()
RETURNS trigger AS
$func$
BEGIN
IF TG_OP = 'INSERT' THEN
EXECUTE format('INSERT INTO %s SELECT .*'
, 'samples_' || left(NEW.md5, 2);
USING NEW;
END IF;
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
而EXECUTE
不需要括号。
并且您知道标识符被折叠为小写,除非在必要时引用(%I
而不是 format()
中的 %s
)。
更多详情:
- INSERT with dynamic table name in trigger function
- How to dynamically use TG_TABLE_NAME in PostgreSQL 8.2?
我有一个简单的任务是将巨大的 MD5 值插入 tables(分区 table),并创建了一个触发器和一个触发器函数来代替 INSERT
操作.在函数中,我检查了 NEW.md5
的前两个字符以确定应该插入哪个 table。
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 语句中?
CREATE FUNCTION foo ()
RETURNS trigger AS
$func$
BEGIN
IF TG_OP = 'INSERT' THEN
EXECUTE format('INSERT INTO %s SELECT .*'
, 'samples_' || left(NEW.md5, 2);
USING NEW;
END IF;
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
而EXECUTE
不需要括号。
并且您知道标识符被折叠为小写,除非在必要时引用(%I
而不是 format()
中的 %s
)。
更多详情:
- INSERT with dynamic table name in trigger function
- How to dynamically use TG_TABLE_NAME in PostgreSQL 8.2?