Din lösning fixar överföringen av den radtypade NEW
variabel. Men du har ett lömskt SQL-injektionshål i din kod, det är särskilt farligt i en SECURITY DEFINER
fungera. Användarinmatning får aldrig konverteras till SQL-kod unescaped.
Rensa så här:
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;
Även:
OLD
är inte definierad i enINSERT
utlösare.- Du behöver ingen variabel. Uppdrag är jämförelsevis dyra i plpgsql.