2016-01-07 15 views
5

Tôi đang cố gắng hiệu quả drop role từ trường hợp hậu trường và gặp phải một số sự cố. Tôi đang tìm một số SQL để drop role để tôi có thể ngừng đọc thông báo lỗi và không phải làm điều này bằng tay.Rớt vai trò và cơ sở dữ liệu sau khi nhận được nhiều khoản trợ cấp

Trong thiết lập Tôi đang làm việc ở, mỗi vai trò được cơ sở dữ liệu riêng của mình cùng tên:

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

Người dùng thường cấp quyền truy cập vào cơ sở dữ liệu trong lược đồ của họ để người dùng khác:

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

Khi tôi cố gắng để thả beta_user, điều này xảy ra:

-- 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 

Tôi có thể kết nối với cơ sở dữ liệu alpha_user, và thả OWNED BY, nhưng điều này là không hiệu quả:

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

Người dùng có thể cấp quyền truy cập tới bất kỳ số lượng cơ sở dữ liệu, và có rất nhiều người sử dụng. Có một tuyên bố (hoặc một loạt các câu lệnh) mà một người dùng siêu có thể thực thi cho DROP OWNED BY cho người dùng trên tất cả các cơ sở dữ liệu mà người dùng đã được cấp quyền truy cập không?

+0

phiên bản của PostgreSQL là gì và hệ điều hành của bạn là gì? –

+0

Postgres 9.4 và Ubuntu 14.04. Tại sao hệ điều hành lại quan trọng? – alacarter

+0

Bạn có thể sử dụng trợ giúp của các công cụ dòng lệnh mà linux cung cấp. –

Trả lời

1

Có lẽ đây sẽ giúp bạn:

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 
Các vấn đề liên quan