PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

A criação de um gatilho para inserção de tabela filha retorna um erro confuso


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 um INSERT acionador.
  • Você não precisa de uma variável. As atribuições são comparativamente caras no plpgsql.