2016-01-07 10 views
5

के बाद पोस्टग्रेस भूमिका और डेटाबेस को छोड़ना मैं पोस्टग्रेस उदाहरण से drop role कुशलतापूर्वक प्रयास करने की कोशिश कर रहा हूं, और कुछ समस्याओं में चल रहा हूं। मैं कुछ एसक्यूएल को drop role पर ढूंढ रहा हूं ताकि मैं त्रुटि संदेशों को पढ़ना बंद कर सकूं और इसे मैन्युअल रूप से करने की आवश्यकता नहीं है।कई अनुदान

सेटअप में मैं में काम कर रहा हूँ, हर भूमिकाओं में एक ही नाम के अपने खुद के डेटाबेस हो जाता है:

CREATE ROLE alpha_user; 
CREATE DATABASE alpha_user; 
ALTER DATABASE alpha_user OWNER TO alpha_user; 

उपयोगकर्ताओं को अक्सर अन्य उपयोगकर्ताओं को अपने डाटाबेस में स्कीमा को पहुंच प्रदान:

-- alpha_user logs in to the alpha_user database 
GRANT USAGE ON SCHEMA myschema TO beta_user; 

जब मैं beta_user ड्रॉप करने का प्रयास, ऐसा होता है:

-- log in as superuser 
DROP ROLE beta_user; 
-- ERROR: role "beta_user" cannot be dropped because some objects depend on it 
-- DETAIL: N objects in database alpha_user 

मैं से कनेक्ट कर सकते alpha_user डेटाबेस, और ड्रॉप OWNED BY, लेकिन यह अक्षम है:

-- log in as superuser 
\c alpha_user; 
DROP OWNED BY beta_user CASCADE; 
DROP beta_user; 
-- success 

उपयोगकर्ता डेटाबेस के किसी भी संख्या को पहुंच प्रदान कर सकते हैं, और कई उपयोगकर्ता हैं। क्या कोई बयान (या कथन की श्रृंखला) है कि एक सुपर उपयोगकर्ता सभी डेटाबेस में उपयोगकर्ता के लिए DROP OWNED BY पर निष्पादित कर सकता है जहां उपयोगकर्ता को पहुंच प्रदान की गई है?

+0

PostgreSQL के अपने संस्करण में क्या है और आपके ऑपरेटिंग सिस्टम क्या है? –

+0

पोस्टग्रेस 9.4, और उबंटू 14.04। ऑपरेटिंग सिस्टम क्यों मायने रखता है? – alacarter

+0

आप लिनक्स प्रदान करता है कि कमांड लाइन उपकरण की मदद का उपयोग कर सकते हैं। –

उत्तर

1

हो सकता है कि यह तुम्हारी मदद करेगा:

with 
    user_id as (select oid, rolname as my_user from pg_authid where rolname in('abc', 'xyz')) 
select 'REVOKE ' || rolname || ' FROM ' || my_user || ' CASCADE;' as sql 
from pg_auth_members 
join pg_authid on pg_auth_members.roleid = pg_authid.oid 
JOIN user_id ON pg_auth_members.member = user_id.oid 
union 
SELECT 'REVOKE ALL ON ' || datname || ' FROM ' || my_user || ' CASCADE;' 
FROM pg_database 
JOIN user_id ON pg_database.datdba = user_id.oid 
संबंधित मुद्दे