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 einemINSERT
definiert auslösen.- Du brauchst keine Variable. Zuweisungen sind in plpgsql vergleichsweise teuer.