PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

La creazione di un trigger per l'inserimento di una tabella figlio restituisce un errore confuso

La tua soluzione risolve il passaggio del NEW digitato in riga variabile. Tuttavia, hai un subdolo buco di iniezione SQL nel tuo codice, che è particolarmente pericoloso in un SECURITY DEFINER funzione. L'input dell'utente deve mai essere convertito in codice SQL senza caratteri di escape.

Igienizza in questo modo:

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;

Inoltre:

  • OLD non è definito in un INSERT trigger.
  • Non hai bisogno di una variabile. Gli incarichi sono relativamente costosi in plpgsql.