एक फ़ंक्शन का शरीर केवल स्ट्रिंग के रूप में संग्रहीत किया जाता है । संदर्भित वस्तुओं की कोई सूची नहीं है। (यह विचारों से अलग है, उदाहरण के लिए, जहां संदर्भित तालिकाओं के वास्तविक लिंक सहेजे गए हैं।)
पोस्टग्रेज 10 या उससे पुराने के लिए यह क्वेरी प्रासंगिक सूची केpg_get_functiondef()
लिए CREATE FUNCTION
स्क्रिप्ट को फिर से संगठित करने के लिए सिस्टम कैटलॉग सूचना फ़ंक्शन का उपयोग करता है और केस-असंवेदनशील नियमित अभिव्यक्ति के साथ तालिका नाम की खोज करता है:
SELECT n.nspname AS schema_name
, p.proname AS function_name
, pg_get_function_arguments(p.oid) AS args
, pg_get_functiondef(p.oid) AS func_def
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE NOT p.proisagg
AND n.nspname NOT LIKE 'pg_%'
AND n.nspname <> 'information_schema'
AND pg_get_functiondef(p.oid) ~* '\mbig\M';
यह काम करना चाहिए, लेकिन यह स्पष्ट रूप से बुलेट-प्रूफ नहीं है। यह गतिशील SQL के लिए विफल हो सकता है जहां तालिका का नाम गतिशील रूप से उत्पन्न होता है और यह किसी भी संख्या में झूठी सकारात्मक लौटा सकता है - खासकर अगर तालिका का नाम एक सामान्य शब्द है।
अलग-अलग कार्य और सिस्टम स्कीमा से सभी कार्यों को बाहर रखा गया है।
\m
और\M
नियमित अभिव्यक्ति में एक शब्द की शुरुआत और अंत को चिह्नित करें।
सिस्टम कैटलॉग pg_proc
पोस्टग्रेज 11. proisagg
में बदल दिया गया था prokind
, इसके द्वारा बदल दिया गया था , सच्ची संग्रहीत प्रक्रियाओं को जोड़ा गया था। आपको अनुकूलन करने की आवश्यकता है। सम्बंधित:
EXECUTE
अभिव्यक्ति की तरह नहीं मिलेगा'mm_'||name_parameter
, और यह उद्धृत नामों के साथ"my""table""
या केस-फोल्डिंग के साथ सही रूप से सामना नहीं करेगा , लेकिन यह ज्यादातर वही करेगा जो ज्यादातर लोग चाहते हैं ।