Supondo que eu tenha a seguinte função sendo executada em uma atualização de linha:
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';
O exemplo acima não funciona porque OLD
é desconhecido nesse contexto de execução. Então eu tentei algo como:
sql := format('INSERT INTO backup_table VALUES (%L)', OLD);
e
sql := format('INSERT INTO backup_table VALUES (%L)', (OLD));
e
sql := format('INSERT INTO backup_table VALUES (%L)', (OLD.*));
Tudo sem sorte.
Esse problema faz parte de um gatilho maior no qual estou trabalhando. Olhando isoladamente não faz muito sentido, mas ilustra a questão.
Depois de muita tentativa e erro, finalmente consegui. O truque foi a notação para tipos de dados compostos (e, mais importante , seu uso ) que acabou me levando a isso: