एक PostgreSQL भूमिका से जुड़ी वस्तुओं को ढूंढें


13

कभी-कभी पहले मैं एक PostgreSQL उपयोगकर्ता नाम बनाया user1 (PostgreSQL 9.4.9)।

मैं इस उपयोगकर्ता को छोड़ना चाहता हूं। इसलिए मैं सबसे पहले टेबल, सीक्वेंस, फ़ंक्शंस, डिफ़ॉल्ट विशेषाधिकारों और स्वामित्व पर सभी अनुमतियां रद्द करता हूं:

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM user1;

REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM user1;

REASSIGN OWNED BY user1 TO postgres;

हालाँकि ऐसा लगता है कि एक उपयोगकर्ता 2 डेटाबेस में इस उपयोगकर्ता से जुड़ा हुआ है:

postgres=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  1 object in database db1
1 object in database db2

यह भी एक समारोह लगता है:

postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  privileges for function text(boolean)
1 object in database db2

लेकिन मैं यह निर्धारित नहीं कर सकता कि कौन सी वस्तु का स्वामित्व है या उपयोगकर्ता 1 से संबंधित है।

अगर मुझे pg_dump -s db1 | grep user1कोई परिणाम नहीं मिलता है! क्या यह एक वैश्विक वस्तु हो सकती है?

मैं लापता वस्तु की पहचान कैसे कर सकता हूं?

मैंने प्रत्येक डेटाबेस में कमांड निष्पादित किया है (db1 और db2)। मैं अपने स्वामित्व वाली वस्तुओं को नहीं छोड़ना चाहता user1, बस इस उपयोगकर्ता के लिए अनुदान देना या हटाना चाहता हूं।

जवाबों:


10

पूछे गए सवाल का जवाब

त्रुटि संदेश और उसके स्वामी में फ़ंक्शन देखने के लिए:

SELECT oid::regprocedure AS function
     , pg_get_userbyid(proowner) AS owner
FROM   pg_proc
WHERE  oid = 'text(boolean)'::regprocedure;

सम्बंधित:

वास्तविक समस्या

त्रुटि संदेश कहता है:

विवरण: फ़ंक्शन टेक्स्ट (बूलियन) के लिए विशेषाधिकार

यह स्वामित्व के बारे में नहीं है बल्कि विशेषाधिकारों के बारे में है ।

के लिए मैनुअल DROP ROLE:

भूमिका छोड़ने से पहले, आपको उन सभी वस्तुओं को छोड़ देना चाहिए जो उनके स्वामित्व में हैं (या उनके स्वामित्व को फिर से असाइन करें) और किसी भी विशेषाधिकार को रद्द करें जो भूमिका अन्य वस्तुओं पर दी गई है

और इसके लिए ALTER DEFAULT PRIVILEGES:

यदि आप एक ऐसी भूमिका को छोड़ना चाहते हैं जिसके लिए डिफ़ॉल्ट विशेषाधिकारों में बदलाव किया गया है, तो भूमिका के लिए डिफ़ॉल्ट विशेषाधिकारों की प्रविष्टि से छुटकारा पाने के लिए इसके डिफ़ॉल्ट विशेषाधिकारों में बदलाव को रद्द करना या DROP OWNEDBY का उपयोग करना आवश्यक है ।

ऐसा लगता है कि आप केवल REASSIGN OWNEDएक DB में निष्पादित हुए हैं, लेकिन मैनुअल निर्देश:

क्योंकि REASSIGN OWNEDअन्य डेटाबेस के भीतर वस्तुओं को प्रभावित नहीं करता है, इसलिए आमतौर पर प्रत्येक डेटाबेस में इस कमांड को निष्पादित करना आवश्यक होता है जिसमें एक भूमिका के स्वामित्व वाली वस्तुएं होती हैं जिन्हें हटाया जाना है।

बोल्ड जोर मेरा।

और आपने अपने आदेशों को प्रतिबंधित कर दिया IN SCHEMA public। ड्रॉप कि खंड पूरे DB को लक्षित करने के लिए। लेकिन परेशान मत हो, एक है ...

के साथ सरल समाधान DROP OWNED

REASSIGN OWNED BY user1 TO postgres;
DROP OWNED BY user1;

भूमिका की सभी वस्तुएं postgresपहले आदेश के साथ स्वामित्व में बदल गईं और अब सुरक्षित हैं। इसका शब्दांकन DROP OWNEDथोड़ा भ्रामक है, क्योंकि यह सभी विशेषाधिकारों और डिफ़ॉल्ट विशेषाधिकारों से भी छुटकारा दिलाता है। के लिए मैनुअल DROP OWNED:

DROP OWNEDवर्तमान डेटाबेस के भीतर सभी वस्तुओं को गिराता है जो कि निर्दिष्ट भूमिकाओं में से एक के स्वामित्व में हैं। वर्तमान डेटाबेस में वस्तुओं पर दी गई भूमिकाओं और साझा किए गए ऑब्जेक्ट्स (डेटाबेस, टेबलस्पेस) पर दिए गए किसी भी विशेषाधिकार को भी निरस्त कर दिया जाएगा।

सभी प्रासंगिक DB में दोहराएं, फिर आप मारने के लिए आगे बढ़ सकते हैं:

DROP ROLE user1;

7

नीचे दी गई क्वेरी मालिकों के साथ वस्तुओं को सूचीबद्ध करती है। सभी विशेषाधिकारों के लिए हमें वास्तव में और अधिक की आवश्यकता है।

--r = ordinary table, i = index, S = sequence, v = view, m = materialized view, c = composite type, t = TOAST table, f = foreign table
SELECT 
    n.nspname AS schema_name,
    c.relname AS rel_name,
    c.relkind AS rel_kind,
    pg_get_userbyid(c.relowner) AS owner_name
  FROM pg_class c
  JOIN pg_namespace n ON n.oid = c.relnamespace

UNION ALL

-- functions (or procedures)
SELECT
    n.nspname AS schema_name,
    p.proname,
    'p',
    pg_get_userbyid(p.proowner)
  FROM pg_proc p
  JOIN pg_namespace n ON n.oid = p.pronamespace

मुझे अभी भी इसके साथ लापता वस्तु नहीं मिली है।
निकोलस पेअर्ट

@NicolasPayart: क्या आप क्वेरी को सही डेटाबेस में निष्पादित कर रहे हैं?
एरविन ब्रान्डस्टेट्टर

1

आपको पहले डेटाबेस से कनेक्ट करना होगा। आपके उदाहरण में यह होगा

\c db1

तथा

\c db2

इसके बाद फिर से सभी प्रिंसिपल्स और रिजल्ट ओनलाइन / ड्रॉप ऑप्ड स्टेटमेंट को रन करने की कोशिश करें।


1
अरे, आपके पहले उत्तर के लिए धन्यवाद। हालाँकि, पोस्ट करने से पहले, कृपया यह सोचें कि यह मौजूदा उत्तरों में क्या जोड़ता है, और अपने उत्तर में भी इसका वर्णन करें।
dezso
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.