Solusi Anda memperbaiki berlalunya NEW
. yang diketik baris variabel. Namun, Anda memiliki lubang injeksi SQL yang licik dalam kode Anda, yang sangat berbahaya dalam SECURITY DEFINER
fungsi. Masukan pengguna harus tidak pernah dikonversi ke kode SQL tanpa meloloskan.
Bersihkan seperti ini:
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;
Juga:
OLD
tidak didefinisikan dalamINSERT
pemicu.- Anda tidak memerlukan variabel. Tugas relatif mahal di plpgsql.