Votre solution corrige le passage du NEW
de type ligne variable. Cependant, vous avez un trou d'injection SQL sournois dans votre code, c'est particulièrement dangereux dans un SECURITY DEFINER
une fonction. L'entrée de l'utilisateur ne doit jamais être converti en code SQL sans échappement.
Désinfectez comme ceci :
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;
Aussi :
OLD
n'est pas défini dans unINSERT
déclencheur.- Vous n'avez pas besoin d'une variable. Les affectations sont relativement chères dans plpgsql.