1. यदि उपयोगकर्ता गलती से अपनी सभी वस्तुओं को सुपर-यूज़र (पोस्टग्रेज़) के साथ बनाता है, और बाद में अन्य उपयोगकर्ता में बदलने का इरादा रखता है, तो REASSIGN OWNED BY काम नहीं करेगा और यह केवल त्रुटि के रूप में:
postgres=# reassign owned by postgres to user1;
ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system
2. यदि उपयोगकर्ता केवल एक स्कीमा ऑब्जेक्ट के स्वामित्व को बदलना चाहता है।
या तो वस्तुओं को बदलने के मामले, "पोस्टग्रेज" उपयोगकर्ता से दूसरे उपयोगकर्ता के लिए या केवल एक स्कीमा ऑब्जेक्ट को बदलने के लिए, हमें प्रत्येक ऑब्जेक्ट के माध्यम से pg_catalog's &Information_schema से ऑब्जेक्ट विवरण एकत्र करके और ALTER TABLE / FUNCTION / AGGREGATE / TYPE पर कॉल करके लूप करना होगा। आदि.
मुझे OS कमांड (sed/egrep) का उपयोग करके pg_dump आउटपुट को ट्विक करने की तकनीक पसंद आई, क्योंकि यह ज्ञात है कि स्वभाव से pg_dump ALTER लिखता है .. हर ऑब्जेक्ट का स्वामी (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPESमैं> ) इसके आउटपुट में। नए USER/SCHEMANAME को sed के साथ बदलकर pg_dump stdout से उन कथनों को ग्रीप करना और फिर उन कथनों को psql क्लाइंट को वापस भेजना चीजों को ठीक कर देगा, भले ही पोस्टग्रेस उपयोगकर्ता के स्वामित्व वाली वस्तु हो। मैंने स्क्रिप्ट में एक ही दृष्टिकोण का उपयोग किया और उपयोगकर्ता को नया उपयोगकर्ता नाम और स्कीमा नाम पास करने की इजाजत दी, इसलिए इसे ALTER… OWNER TO .. कथन में बदलने के लिए।
स्क्रिप्ट उपयोग और आउटपुट:
sh change_owner.sh -n new_rolename -S schema_name
-bash-4.1$ sh change_owner.sh -n user1 -S public
Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2
आप यहां से स्क्रिप्ट डाउनलोड कर सकते हैं, और इसके उपयोग में आपकी सहायता के लिए README भी है।