आपको केवल सिस्टम कैटलॉग में सीधे हेरफेर करना चाहिए , यदि आप जानते हैं कि आप वास्तव में क्या कर रहे हैं। इसके अप्रत्याशित दुष्प्रभाव हो सकते हैं। या आप मरम्मत से परे डेटाबेस (या पूरे डेटाबेस क्लस्टर) को भ्रष्ट कर सकते हैं।
जेरेमी का जवाब , मूल रूप से छल करते हुए, आम जनता के लिए उचित नहीं है । यह बिना किसी स्कीमा के सभी कार्यों को बिना शर्त बदलता है। क्या आप सुनिश्चित हैं कि कोई सिस्टम फ़ंक्शन प्रभावित नहीं हैं या एक अतिरिक्त मॉड्यूल द्वारा स्थापित फ़ंक्शन हैं?
यह उन कार्यों के स्वामी को बदलने के लिए भी व्यर्थ होगा जो पहले से ही नामित मालिक के हैं।
पहले, जांचें कि REASSIGN OWNED
क्या आप काम कर सकते हैं:
डेटाबेस ऑब्जेक्ट्स के स्वामित्व वाले डेटाबेस की भूमिका को बदलें
आपको स्पष्ट रूप से अस्वीकृत होने के लिए सभी भूमिकाओं को सूचीबद्ध करना होगा। लेकिन यह फिर से कार्य करता है ।
किसी दिए गए स्कीमा में सभी फ़ंक्शंस (और कोई अन्य ऑब्जेक्ट) असाइन करने के लिए एक नए मालिक (वैकल्पिक रूप से पिछले मालिक की परवाह किए बिना):
SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'
यह सभी कार्यों (निर्दिष्ट स्कीमा में) को बदलने के लिए विहित SQL कमांडALTER FUNCTION ...
उत्पन्न करता है । आप उन्हें निष्पादित करने से पहले आदेशों का निरीक्षण कर सकते हैं - एक बार में एक या एक बार में:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
मैंने कुछ टिप्पणी WHERE
खंड शामिल किए हैं जिनका उपयोग आप परिणामों को फ़िल्टर करने के लिए कर सकते हैं।
regprocedure
मापदंडों के साथ एक वैध फ़ंक्शन नाम का उत्पादन करने के लिए , डबल-उद्धृत जहां आवश्यक हो, स्कीमा - योग्य जहां वर्तमान के लिए आवश्यक है search_path
।
कुल फ़ंक्शन string_agg () के लिए PostgreSQL 9.0 या बाद के संस्करण की आवश्यकता होती है। पुराने संस्करण के साथ array_agg()
और array_to_string()
।
आप यह सब एक DO
बयान या इस संबंधित जवाब में प्रदर्शन की तरह एक समारोह में डाल सकता है :
9.5 या बाद के पोस्टग्रेज में, आप नए ऑब्जेक्ट पहचानकर्ता प्रकारोंregnamespace
regrole
का उपयोग करके क्वेरी को सरल कर सकते हैं और :
SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc
WHERE pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'
pg_proc.proisagg
पीजी 11 में बदल दिया जाता है रिलीज नोट्स का कहना है: प्रणाली तालिका बदलेंpg_proc
कीproisagg
औरproiswindow
साथprokind
(पीटर Eisentraut) `