PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

La création d'un déclencheur pour l'insertion d'une table enfant renvoie une erreur déroutante

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 un INSERT déclencheur.
  • Vous n'avez pas besoin d'une variable. Les affectations sont relativement chères dans plpgsql.