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:
OLD
no está definido en unINSERT
disparador.- No necesita una variable. Las asignaciones son comparativamente caras en plpgsql.