Vaše řešení opravuje předávání řádku NEW
proměnná. Máte však ve svém kódu záludnou díru pro vkládání SQL, což je obzvláště nebezpečné v SECURITY DEFINER
funkce. Vstup uživatele nesmí být nikdy být převeden na kód SQL bez kódování.
Dezinfikujte takto:
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;
Také:
OLD
není definován vINSERT
spoušť.- Nepotřebujete proměnnou. Úkoly jsou v plpgsql poměrně drahé.