2010-06-11 28 views
77

Tôi đang cố gắng hạn chế người dùng DB cho ứng dụng tôi đang làm việc và tôi muốn bỏ người dùng cơ sở dữ liệu Postgres mà tôi đang sử dụng để thử nghiệm. Có cách nào để bỏ người dùng mà không phải thu hồi tất cả các quyền của mình theo cách thủ công trước hay thu hồi tất cả các khoản tài trợ mà người dùng có?PostgreSQL - cách nhanh chóng bỏ người dùng với các đặc quyền hiện tại

Trả lời

84

Làm thế nào về

DROP USER <username> 

Đây thực sự là một bí danh cho DROP ROLE.

Bạn phải khám phá bất kỳ đặc quyền nào được liên kết với người dùng đó, đồng thời chuyển quyền sở hữu của nó sang các vai trò khác (hoặc thả đối tượng).

Điều này đạt được tốt nhất bằng

REASSIGN OWNED BY <olduser> TO <newuser> 

DROP OWNED BY <olduser> 

Sau này sẽ loại bỏ bất kỳ đặc quyền được cấp cho người dùng.

Xem tài liệu bưu điện cho DROP ROLEthe more detailed description về điều này.


Addition:

Rõ ràng, cố gắng thả một người dùng bằng cách sử dụng các lệnh đề cập ở đây sẽ chỉ làm việc nếu bạn đang thực hiện chúng trong khi được kết nối với cơ sở dữ liệu tương tự mà các TÀI TRỢ gốc đã được thực hiện từ, như đã thảo luận ở đây:

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

+9

Làm: 'TẠO BẢNG foo (thanh SERIAL); ALTER TABLE foo CHỦ SỞ HỮU ĐẾN; TẠO người thử nghiệm USER; CẤP TẤT CẢ ON foo TO testuser; DROP USER testuser' cung cấp các thông báo lỗi: 'ERROR: role" testuser "không thể bị xóa vì một số đối tượng phụ thuộc vào nó DETAIL: truy cập vào bảng foo'. Tuy nhiên, 'DROP OWNED BY testuser' đã thực hiện thủ thuật, rõ ràng Postgres coi tài trợ là đối tượng có thể phân đoạn. – millimoose

+1

Xin vui lòng làm rõ, @Tim Kane và millimoose: Tôi thực sự không muốn các bảng gốc được thả xuống nếu tôi CẤP CHỌN TRÊN FOO TESTUSER và sau đó DROP OWNED BY TESTUSER. Tôi nghĩ rằng bạn đang nói rằng DROP OWNED BY chỉ là giảm các khoản tài trợ nhưng sẽ không bỏ đối tượng mà khoản trợ cấp đã được thực hiện. Chính xác? –

+1

Andrew, tốt nhất để đọc tài liệu để làm rõ. DROP OWNED * sẽ * thả bảng do người dùng đó sở hữu. REASSIGN OWNED BY sẽ gán lại các bảng đó cho một người dùng khác. Chọn một. –

8

Cũng lưu ý, nếu bạn đã cấp một cách rõ ràng:

CONNECT ON DATABASE xxx TO GROUP,

bạn sẽ cần phải thu hồi này tách biệt khỏi thả NƯỚC BY, sử dụng:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

-9

tôi phải đối mặt với cùng một vấn đề và bây giờ đã tìm ra cách để giải quyết nó. Trước tiên, bạn phải xóa cơ sở dữ liệu của người dùng mà bạn muốn thả. Sau đó, người dùng có thể dễ dàng bị xóa.

Tôi đã tạo một người dùng có tên "msf" và gặp khó khăn trong một thời gian để xóa người dùng và tạo lại nó. Tôi đã làm theo các bước dưới đây và Got đã thành công.

1) Thả cơ sở dữ liệu

dropdb msf 

2) thả người dùng

dropuser msf 

Bây giờ tôi có người sử dụng giảm thành công.

+1

Đây là một cách tiếp cận cắt giảm không thể tin được, vì nó đòi hỏi tôi phải tạo lại lược đồ cơ sở dữ liệu cho mỗi lần lặp lại công việc của tôi. (Có liên quan đến việc có các quyền hạn chi tiết trên lược đồ cơ sở dữ liệu hiện có, tức là tốt nhất nếu lược đồ cơ sở dữ liệu không bị ảnh hưởng.) – millimoose

1

Câu trả lời được chấp nhận dẫn đến lỗi cho tôi khi cố gắng REASSIGN OWNED BY hoặc DROP OWNED BY.Sau đây là làm việc cho tôi:

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; 

Người dùng có thể có đặc quyền trong lược đồ khác, trong trường hợp này bạn sẽ phải chạy dòng thu hồi phù hợp với "công cộng" thay thế bằng sơ đồ chính xác. Để hiển thị tất cả các lược đồ và các loại đặc quyền cho một người sử dụng, tôi thay đổi nội dung các lệnh \ dp để làm cho truy vấn này:

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%'; 

Tôi không chắc chắn những loại đặc quyền tương ứng với thu hồi trên BẢNG, trình tự, hoặc chức năng, nhưng tôi nghĩ tất cả chúng đều thuộc một trong ba.

Các vấn đề liên quan