Su solución corrige el paso del NEW de tipo fila variable. Sin embargo, tiene un agujero de inyección de SQL furtivo en su código, eso es particularmente peligroso en un SECURITY DEFINER función. La entrada del usuario debe nunca convertirse a código SQL sin escape.
Desinfecte así:
CREATE OR REPLACE FUNCTION trg_test_log()
RETURNS trigger AS
$$
BEGIN
EXECUTE 'INSERT INTO public.' || quote_ident('testlog_' || NEW.name)
|| ' SELECT ($1).*'
USING NEW;
RETURN NULL;
END
$$
LANGUAGE plpgsql SECURITY DEFINER;
También:
OLDno está definido en unINSERTdisparador.- No necesita una variable. Las asignaciones son comparativamente caras en plpgsql.