Вашето решение коригира предаването на въведения от ред NEW
променлива. Въпреки това, имате подъл дупка за инжектиране на SQL в кода си, това е особено опасно в SECURITY DEFINER
функция. Въвеждането на потребителя трябва никога да се преобразува в SQL код без екраниране.
Дезинфекцирайте по следния начин:
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;
Също така:
OLD
не е дефиниран вINSERT
задействане.- Не се нуждаете от променлива. Заданията са сравнително скъпи в plpgsql.