假设我在行更新时执行了以下函数:
CREATE OR REPLACE FUNCTION versioned_update()
RETURNS TRIGGER AS $$
DECLARE
sql TEXT;
BEGIN
sql := 'INSERT INTO backup_table VALUES (OLD)';
EXECUTE sql;
END;
$$ language 'plpgsql';
上面的示例不起作用,因为OLD
在该执行上下文中是未知的。所以我尝试了类似的东西:
sql := format('INSERT INTO backup_table VALUES (%L)', OLD);
和
sql := format('INSERT INTO backup_table VALUES (%L)', (OLD));
和
sql := format('INSERT INTO backup_table VALUES (%L)', (OLD.*));
一切都没有运气。
这个问题是我正在处理的一个更大的触发器的一部分。孤立地看,它没有多大意义,但说明了问题。
经过大量的反复试验,我终于弄明白了。诀窍是复合数据类型的符号(更重要的是它们的用法)最终导致我这样做: