इसे उसी क्लस्टर के प्रत्येक डेटाबेस में चलाएँ जहाँ भूमिका कुछ भी हो सकती है या कोई विशेषाधिकार प्राप्त हो सकता है:
REASSIGN OWNED BY some_role_name TO postgres;
DROP OWNED BY some_role_name;
पोस्टग्रेज
डिफ़ॉल्ट सुपरयूज़र होने के नाते, आप किसी अन्य को चुन सकते हैं। यह वर्तमान में पुरानी भूमिका के स्वामित्व वाली वस्तुओं का स्वामी होने जा रहा है। खुद को पुनः प्राप्त करें
के तुरंत बाद
, ऐसी कोई वस्तु नहीं बची है जो स्वामित्व वाली . होगी एक ही उपयोगकर्ता द्वारा। DROP OWNED
चलाना शायद सहज न लगे
. कमांड का शब्दांकन भ्रामक है, क्योंकि यह भी एक ही डेटाबेस में भूमिका के लिए सभी विशेषाधिकारों और डिफ़ॉल्ट विशेषाधिकारों को निरस्त करता है। मैनुअल:
बोल्ड जोर मेरा।
आपको अभी भी इसे हर एक डेटाबेस में निष्पादित करना है जहां भूमिका के पास कुछ भी हो या उसे कोई विशेषाधिकार प्राप्त हो। मैनुअल:
अंत में, दौड़ें (एक बार):
DROP role some_role_name;
भूमिकाओं को एक क्लस्टर-वाइड सिस्टम कैटलॉग में संग्रहीत किया जाता है, जबकि ऑब्जेक्ट पर स्वामित्व और विशेषाधिकार डेटाबेस-स्थानीय सिस्टम कैटलॉग में संग्रहीत किए जाते हैं।
इस संबंधित उत्तर में विस्तृत विवरण:
निर्देश के साथ मैनुअल में संबंधित पेज है। ।
पूर्ण स्वचालन
यह सब करने के लिए कोई एकल आदेश नहीं है। लेकिन आप Postgres को आपके लिए एक पूर्ण psql स्क्रिप्ट जेनरेट करने दे सकते हैं।
भूमिकाओं के लिए निर्भरता सिस्टम कैटलॉग pg_shdependमें संग्रहित की जाती है। कोड>
:
चूंकि हमें (संभावित रूप से) विभिन्न डेटाबेस से जुड़ने की आवश्यकता है, हमें psql मेटा-कमांड (\c my_database
) के संयोजन की आवश्यकता है ) और SQL DDL कमांड जैसा कि ऊपर दिखाया गया है। इस फ़ंक्शन को अपने DB क्लस्टर में कहीं एक बार बनाएँ:
CREATE OR REPLACE FUNCTION f_generate_ddl_to_remove_role(dead_role_walking regrole)
RETURNS text
LANGUAGE sql AS
$func$
SELECT concat_ws(
E'\n'
,(SELECT string_agg(format(E'\\c %I\nREASSIGN OWNED BY %2$s TO postgres; DROP OWNED BY %2$s;'
, d.datname, dead_role_walking)
, E'\n')
FROM (
SELECT DISTINCT dbid
FROM pg_shdepend
WHERE refobjid = dead_role_walking
) s
JOIN pg_database d ON d.oid = s.dbid)
, format(E'DROP role %s;\n', dead_role_walking)
)
$func$;
कॉल करें:
SELECT f_generate_ddl_to_remove_role('some_role_name');
एक स्ट्रिंग उत्पन्न करता है जैसे:
पोस्टग्रेज करने के लिए\c my_db1
REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;
\c my_db2
REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;
DROP role some_role_name;
या, यदि भूमिका के पास कुछ भी नहीं है और उसके पास कोई विशेषाधिकार नहीं है, तो बस:
DROP role some_role_name;
यदि आप एक गैर-मौजूदा भूमिका नाम प्रदान करते हैं, तो आपको एक त्रुटि मिलती है।
स्ट्रिंग को कॉपी करें (बिना सिंगल कोट्स को बंद किए) एक सुपरयूज़र के साथ खोले गए psql सत्र में postgres
. या इसके साथ एक बैश स्क्रिप्ट को जोड़ दें। सब हो गया।
डायनेमिक SQL के लिए अधिक स्पष्टीकरण के साथ कई संबंधित उत्तर हैं: