Twoje rozwiązanie naprawia przekazywanie wpisanego wiersza NEW
zmienny. Masz jednak w swoim kodzie podstępną lukę we wstrzykiwaniu SQL, która jest szczególnie niebezpieczna w SECURITY DEFINER
funkcjonować. Dane wprowadzane przez użytkownika muszą nigdy zostać przekonwertowane na kod SQL bez ucieczki.
Odkaż w ten sposób:
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;
Również:
OLD
nie jest zdefiniowany wINSERT
wyzwalacz.- Nie potrzebujesz zmiennej. Zadania są stosunkowo drogie w plpgsql.