PostgreSQL: विशिष्ट संग्रह तक पहुंचने वाले सभी संग्रहीत कार्यों को कैसे सूचीबद्ध करें


13

परिचय:

पोस्टग्रेएसक्यूएल डेटाबेस कई सौ संग्रहीत कार्यों के साथ, अप्रचलित सहित, उपयोग नहीं किया गया आदि।

मुसीबत

मुझे उन सभी संग्रहीत कार्यों का पता लगाने की आवश्यकता है जिनका तालिका एक्स से कोई संबंध है - जैसा कि मैं तालिका संरचना को बदलना चाहता हूं। उनमें से कुछ का उपयोग नहीं किया जा सकता है, इसलिए मैं कोड के माध्यम से देख कर ऐसा नहीं कर सकता।

मेरे पास जो समाधान है, वह psql's \df+और grepping आउटपुट चला रहा है, लेकिन मैं अधिक डेटाबेस-जैसा समाधान पसंद करूँगा, अर्थात सूचना स्कीमा का उपयोग करके। यह निश्चित रूप से एक दोहरावदार कार्य होगा और मैं इसे अच्छा और साफ रखना चाहूंगा।

कोई सुझाव?

जवाबों:


18

एक फ़ंक्शन का शरीर केवल स्ट्रिंग के रूप में संग्रहीत किया जाता है । संदर्भित वस्तुओं की कोई सूची नहीं है। (यह विचारों से अलग है, उदाहरण के लिए, जहां संदर्भित तालिकाओं के वास्तविक लिंक सहेजे गए हैं।)

पोस्टग्रेज 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, इसके द्वारा बदल दिया गया था , सच्ची संग्रहीत प्रक्रियाओं को जोड़ा गया था। आपको अनुकूलन करने की आवश्यकता है। सम्बंधित:


1
हां ... यह पूरी तरह से मजबूत नहीं है, इस अर्थ में कि यह EXECUTEअभिव्यक्ति की तरह नहीं मिलेगा 'mm_'||name_parameter, और यह उद्धृत नामों के साथ "my""table""या केस-फोल्डिंग के साथ सही रूप से सामना नहीं करेगा , लेकिन यह ज्यादातर वही करेगा जो ज्यादातर लोग चाहते हैं ।
क्रेग रिंगर

@ क्रेगिंगर: हाँ, गतिशील क्वेरीज़ EXECUTEको कवर करना लगभग असंभव है। लेकिन केस-फोल्डिंग को ~*इसके बजाय कवर किया जा सकता है ~- या किसी अन्य केस-असंवेदनशील पैटर्न-मिलान के साथ।
एरविन ब्रान्डसेट्टर

तो जब तक ऑपरेटर पागल पर्याप्त वास्तव में नामित तालिकाएं बनाने के लिए नहीं है "MyTable"और MyTableकम से कम, ... और ईमानदारी से, यह है कि एक "अच्छी तरह से, कि अनुमति दी जा सकती है, लेकिन यह स्मार्ट नहीं है" चाल।
क्रेग रिंगर

जवाब के लिए धन्यवाद! मैं वास्तव में कहीं भी डायनामिक टेबल नाम निर्माण का उपयोग नहीं करता हूं और सभी टेबल नाम लोअरकेस हैं।
सर्गेई कुद्रियात्सेव

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.