आपका समाधान पंक्ति-टाइप की गई NEW
के पारित होने को ठीक करता है चर। हालांकि, आपके कोड में एक गुप्त SQL-इंजेक्शन छेद है, जो विशेष रूप से खतरनाक है एक SECURITY DEFINER
. में समारोह। उपयोगकर्ता इनपुट कभी नहीं . होना चाहिए एसक्यूएल कोड में परिवर्तित नहीं किया जा सकता है।
ऐसे करें सेनिटाइज:
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 में असाइनमेंट तुलनात्मक रूप से महंगे हैं।