PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

विशेषाधिकारों के साथ एक भूमिका छोड़ें

इसे उसी क्लस्टर के प्रत्येक डेटाबेस में चलाएँ जहाँ भूमिका कुछ भी हो सकती है या कोई विशेषाधिकार प्राप्त हो सकता है:

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 के लिए अधिक स्पष्टीकरण के साथ कई संबंधित उत्तर हैं:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेस्क्ल जोंस एग्रीगेट

  2. एक्सेल फ़ाइल के रूप में PostgreSQL क्वेरी आउटपुट

  3. PostgreSQL के लिए एक इष्टतम वातावरण की स्थापना

  4. मैं मैक ओएस 10.6.3 पर psycopg2 स्थापित करने का प्रयास कर रहा हूं; यह दावा करता है कि यह stdarg.h नहीं ढूंढ सकता है लेकिन मैं इसे वहां देख सकता हूं; मैं क्या करूँ?

  5. sqlalchemy.exc.NoSuchModuleError:प्लगइन लोड नहीं कर सकता:sqlalchemy.dialects:postgres