Postgresql: GRANT ALL PRIVILEGES ON DATABASE làm gì?


60

Tôi đang cố gắng cấp tất cả các đặc quyền trên tất cả các bảng của cơ sở dữ liệu nhất định cho người dùng postgres mới (không phải chủ sở hữu). Có vẻ như điều GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;đó không làm điều đó. Sau khi chạy lệnh đã nói thành công (với tư cách là người dùng postgres), tôi nhận được thông tin sau là new_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Hai câu hỏi:

1) Lệnh trên làm gì, sau đó, nếu không cấp tất cả các quyền trên tất cả các bảng trên my_db?

2) Cách thích hợp để cấp tất cả các quyền trên tất cả các bảng cho người dùng là gì? (bao gồm tất cả các bảng được tạo trong tương lai)

Câu trả lời:


80

Các câu trả lời cho câu hỏi của bạn đến từ các tài liệu PostgreQuery 8.4 trực tuyến .

  1. GRANT ALL PRIVILEGES ON DATABASEcấp cho CREATE, CONNECTTEMPORARYcác đặc quyền trên một cơ sở dữ liệu đến một vai trò (người dùng được gọi đúng là vai trò ). Không có đặc quyền nào trong số đó thực sự cho phép vai trò đọc dữ liệu từ bảng; SELECTđặc quyền trên bàn là cần thiết cho điều đó.

  2. Tôi không chắc chắn có một cách "thích hợp" để cấp tất cả các đặc quyền trên tất cả các bảng cho một vai trò. Cách tốt nhất để đảm bảo vai trò nhất định có tất cả các đặc quyền trên một bảng là đảm bảo rằng vai trò đó sở hữu bảng. Theo mặc định, mọi đối tượng mới được tạo đều thuộc sở hữu của vai trò đã tạo ra nó, vì vậy nếu bạn muốn một vai trò có tất cả các đặc quyền trên một bảng, hãy sử dụng vai trò đó để tạo ra nó.

    PostgreSQL 9.0 giới thiệu cú pháp sau đây gần như là những gì bạn muốn:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    Điều khó hiểu là nếu bạn tạo các bảng trong các lược đồ bên ngoài lược đồ "công khai" mặc định, thì điều này GRANTsẽ không áp dụng cho chúng. Nếu bạn sử dụng các lược đồ ngoài công cộng, bạn sẽ phải dành riêng GRANTcác đặc quyền cho các lược đồ đó.


1
một cơ sở dữ liệu có thể có nhiều chủ sở hữu? Nếu vậy, làm thế nào để thêm chủ sở hữu khác?
rz.

không tôi không nghĩ rằng một cơ sở dữ liệu có thể có nhiều hơn một chủ sở hữu, bạn có thể cung cấp cho họ tất cả các bài viết của một chủ sở hữu
hellomynameisjoel

15
đừng quên bạn phải thực hiện tương tự theo trình tự: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;hoặc bạn không thể chèn bất kỳ bản ghi nào.

Ngay cả khi nó không hoạt động, hãy thử điều này: = GRANT ALL PRIVILEGES TRÊN TẤT CẢ CÁC BẢNG TRONG SCHema công khai với your_user;
Kaustubh

10

Có thể thiết lập nhiều thông tin đăng nhập để đóng vai trò là chủ sở hữu cơ sở dữ liệu:

  • Tạo vai trò "nologin" để đóng vai trò là chủ sở hữu: create role dbowner nologin
  • Thay đổi chủ sở hữu cơ sở dữ liệu của bạn thành này: alter database mydb owner dbowner
  • Cấp tất cả thông tin đăng nhập của bạn cho vai trò mới này: grant dbowner to user1, user2

Bây giờ, nếu đăng nhập user1 hoặc user2, họ có tất cả các quyền trên "mydb" mà không cần thêm bất kỳ khoản trợ cấp nào.

Tuy nhiên, tôi sẽ xem xét giải pháp này một cách cẩn thận. Thật hấp dẫn khi ứng dụng web của bạn sử dụng một trong những thông tin đăng nhập này để tránh sự đau đớn khi tạo các khoản trợ cấp bổ sung bất cứ khi nào lược đồ được cập nhật, nhưng bạn đang loại bỏ một hình thức bảo vệ rất hữu ích theo cách này. Sử dụng giải pháp trên nếu bạn thực sự muốn có nhiều "quản trị viên", nhưng vẫn sử dụng mẫu "cấp tất cả các đặc quyền trên tất cả các bảng trong lược đồ ..." ở trên để đăng nhập cho ứng dụng "sử dụng thông thường" của bạn.


1
Chris Cogdon, chỉ là một sửa chữa nhỏ: thay đổi cơ sở dữ liệu chủ sở hữu mydb thành dbowner
user876743
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.