PostgreSQL - मौजूदा विशेषाधिकारों के साथ उपयोगकर्ता को जल्दी से कैसे गिराया जाए


122

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

जवाबों:


144

कैसा रहेगा

DROP USER <username>

यह वास्तव में एक उपनाम है DROP ROLE

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

यह सबसे अच्छा हासिल किया है

REASSIGN OWNED BY <olduser> TO <newuser>

तथा

DROP OWNED BY <olduser>

बाद वाला उपयोगकर्ता को दिए गए किसी भी विशेषाधिकार को हटा देगा।

DROP ROLE के लिए पोस्टग्रोज़ डॉक्स और इसके बारे में अधिक विस्तृत विवरण देखें


इसके अलावा:

जाहिर है, यहां उल्लिखित आदेशों का उपयोग करके एक उपयोगकर्ता को छोड़ने की कोशिश केवल तभी काम करेगी जब आप उन्हें उसी डेटाबेस से कनेक्ट होने के दौरान निष्पादित कर रहे हैं जो मूल GRANTS से बनाया गया था, जैसा कि यहां चर्चा की गई है:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local


11
कर: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser त्रुटि संदेश दिया ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo:। हालांकि, DROP OWNED BY testuserचाल चली, जाहिरा तौर पर Postgres अनुदानों को छोड़ने योग्य वस्तु मानता है।
मिली जुआन

1
कृपया स्पष्ट करें, @ टिम केन और मिलिमोस: मैं वास्तव में मूल सारणी को नहीं छोड़ना चाहता हूं यदि मैं फ़ॉस्ट टू टेस्टेज़र का चयन करता हूं और फिर टेस्ट द्वारा तैयार किया गया है। मुझे लगता है कि आप कह रहे हैं कि DROP OWNED BY केवल अनुदान छोड़ रहा है लेकिन उस वस्तु को नहीं छोड़ेगा जिसके लिए अनुदान किया गया था। सही बात?
एंड्रयू वुल्फ

1
एंड्रयू, स्पष्टीकरण के लिए प्रलेखन पढ़ने के लिए सबसे अच्छा है। DROP OWNED BY उस उपयोगकर्ता के स्वामित्व वाले टेबल को छोड़ देगा । REASSIGN OWNED BY उन टेबलों को एक अलग यूजर को फिर से असाइन करेगा। एक चुनो।
टिम केन

3
अगर आप DROP OWNED के बारे में चिंतित हैं तो REASSIGN OWNED करने के बाद भी बहुत कुछ निकाल लेते हैं जब विशेषाधिकार अभी भी पकड़े हुए हैं, तो आप सभी [सभी | SEQUENCES | ...] पर SCHOA [स्कीमा नाम] से [] भूमिका निभा सकते हैं
jla

दरअसल, DROP OWNED BY कमांड इसके अर्थ और प्रभावों में थोड़ा अस्पष्ट है। मुझे इसे सही तरीके से प्राप्त करने के लिए डॉक्टर को ध्यान से पढ़ना पड़ा। दोस्तों पोस्ट के लिए धन्यवाद।
सेबास्टियन क्लेमेंट

49

स्वीकृत उत्तर मेरे लिए त्रुटियों के परिणामस्वरूप हुआ जब REASSIGN OWNED BY या DROP OWNED BY का प्रयास किया गया। निम्नलिखित ने मेरे लिए काम किया:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

उपयोगकर्ता के पास अन्य स्कीमा में विशेषाधिकार हो सकते हैं, जिस स्थिति में आपको सही स्कीमा द्वारा प्रतिस्थापित "पब्लिक" के साथ उपयुक्त REVOKE लाइन को चलाना होगा। उपयोगकर्ता के लिए सभी स्कीमा और विशेषाधिकार प्रकार दिखाने के लिए, मैंने इस क्वेरी को बनाने के लिए \ dp कमांड को संपादित किया:

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

मुझे यकीन नहीं है कि किस प्रकार के विशेषाधिकार टैब, अनुक्रम, या फ़ंक्शंस पर घूमने के अनुरूप हैं, लेकिन मुझे लगता है कि वे सभी तीन में से एक के तहत आते हैं।


12
मुझे इसे भी जोड़ना था:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
वोज्शिएक जकुबास

3
स्कीमा विशेषाधिकार भी।
महानोवैन

2
स्कीमा के विशेषाधिकारों के लिए:revoke USAGE on SCHEMA some_schema from username;
अल्फ़ा

मैंने यह कोशिश की लेकिन समस्या मेरे मामले में बनी हुई है। मैं में अलग प्रश्न यह पोस्ट किए जाने stackoverflow.com/questions/61168608/...
एंड्रस

17

यह भी ध्यान दें, यदि आपने स्पष्ट रूप से दी है:

CONNECT ON DATABASE xxx TO GROUP ,

आपको इसका उपयोग करते हुए DROP OWNED BY से अलग से इसे रद्द करना होगा:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


मैंने ऊपर सब कुछ करने की कोशिश की थी और यह अभी भी मेरे लिए काम नहीं कर रहा था, जब तक कि मैंने इसे थोड़ा और आगे बढ़ाया, तो अब मेरे पास कुछ बाल बचे हैं। कुछ। : D धन्यवाद!
मिच कैंट

6

मुझे REVOKE में एक और पंक्ति जोड़नी थी ...

चलने के बाद:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

मुझे अभी भी त्रुटि प्राप्त हो रही थी: उपयोगकर्ता नाम नहीं छोड़ा जा सकता क्योंकि कुछ वस्तुएं इस पर निर्भर हैं: स्कीमा: स्कीमा जनता के लिए विशेषाधिकार

मुझे यह याद आ रहा था:

REVOKE USAGE ON SCHEMA public FROM username;

तब मैं भूमिका को छोड़ने में सक्षम था।

DROP USER username;

उदाहरण के लिए, आपके पास 'SCHEMA pg_catalog' के लिए विशेषाधिकारों को निरस्त करने की आवश्यकता हो सकती है, उदाहरण के लिए pg_rewind जो pg_read_binary_file जैसे कार्यों पर विशेषाधिकार है।
ग्रीनरॉप्रेट

5

यहाँ आखिर मेरे लिए क्या काम किया गया है:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

2

कोई नहीं है REVOKE ALL PRIVILEGES ON ALL VIEWS, इसलिए मैं इसके साथ समाप्त हो गया:

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

और सामान्य:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

निम्नलिखित के लिए सफल होने के लिए:

drop role "XUSER";

0

कमांडलाइन में, dropuserउपयोगकर्ता को पोस्टग्रेज से ड्रॉप करने के लिए एक कमांड उपलब्ध है।

$ dropuser someuser

-19

मैंने उसी समस्या का सामना किया और अब इसे हल करने का एक तरीका मिल गया। सबसे पहले आपको उस उपयोगकर्ता के डेटाबेस को हटाना होगा जिसे आप ड्रॉप करना चाहते हैं। तब उपयोगकर्ता को आसानी से हटाया जा सकता है।

मैंने "msf" नाम का एक उपयोगकर्ता बनाया और उपयोगकर्ता को हटाने और इसे फिर से बनाने के लिए कुछ समय संघर्ष किया। मैंने नीचे के चरणों का पालन किया और गोट सफल रहा।

1) डेटाबेस ड्रॉप

dropdb msf

2) उपयोगकर्ता ड्रॉप

dropuser msf

अब मुझे उपयोगकर्ता सफलतापूर्वक मिल गया।


2
यह एक अविश्वसनीय स्लैश-एंड-बर्न दृष्टिकोण है, क्योंकि इससे मुझे अपने काम के हर पुनरावृत्ति के लिए डेटाबेस स्कीमा को फिर से बनाने की आवश्यकता होगी। (जो मौजूदा डेटाबेस स्कीमा पर ठीक-ठाक अनुमतियाँ सम्‍मिलित करता है; अर्थात यदि डेटाबेस स्कीमा अछूता रहता है तो यह सबसे अच्छा है।)
२२:०५ पर मिलिमोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.