PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Das Erstellen eines Triggers zum Einfügen einer untergeordneten Tabelle gibt einen verwirrenden Fehler zurück

Ihre Lösung behebt die Übergabe des Zeilentyps NEW Variable. Sie haben jedoch eine hinterhältige SQL-Injection-Lücke in Ihrem Code, die besonders gefährlich ist in einem SECURITY DEFINER Funktion. Benutzereingaben dürfen nie erfolgen in SQL-Code ohne Escapezeichen konvertiert werden.

So desinfizieren:

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;

Auch:

  • OLD ist nicht in einem INSERT definiert auslösen.
  • Du brauchst keine Variable. Zuweisungen sind in plpgsql vergleichsweise teuer.