sql >> Base de Datos >  >> RDS >> PostgreSQL

La creación de un activador para la inserción de una tabla secundaria devuelve un error confuso

Su solución corrige el paso del NEW de tipo fila variable. Sin embargo, tiene un agujero de inyección de SQL furtivo en su código, eso es particularmente peligroso en un SECURITY DEFINER función. La entrada del usuario debe nunca convertirse a código SQL sin escape.

Desinfecte así:

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;

También:

  • OLD no está definido en un INSERT disparador.
  • No necesita una variable. Las asignaciones son comparativamente caras en plpgsql.