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ż:
OLDnie jest zdefiniowany wINSERTwyzwalacz.- Nie potrzebujesz zmiennej. Zadania są stosunkowo drogie w plpgsql.