Sua solução corrige a passagem do
NEW
digitado em linha variável. No entanto, você tem um buraco de injeção de SQL sorrateiro em seu código, que é especialmente perigoso em um SECURITY DEFINER
função. A entrada do usuário deve nunca ser convertido em código SQL sem escape. Higienize assim:
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;
Também:
OLD
não está definido em umINSERT
acionador.- Você não precisa de uma variável. As atribuições são comparativamente caras no plpgsql.