Khái niệm cơ bản trong Postgres
Vai trò là các đối tượng toàn cục có thể truy cập tất cả cơ sở dữ liệu trong một cụm db - được cung cấp các đặc quyền bắt buộc.
A cụm nắm giữ nhiều cơ sở dữ liệu , chứa nhiều lược đồ . Các lược đồ (thậm chí có cùng tên) trong các DB khác nhau là không liên quan. Việc cấp đặc quyền cho một lược đồ chỉ áp dụng cho lược đồ cụ thể này trong DB hiện tại (DB hiện tại tại thời điểm cấp).
Mọi cơ sở dữ liệu đều bắt đầu bằng một lược đồ public
theo mặc định. Đó là một quy ước và nhiều cài đặt bắt đầu với nó. Ngoài ra, lược đồ public
chỉ là một lược đồ giống như bất kỳ lược đồ nào khác.
Đến từ MySQL, bạn có thể muốn bắt đầu với một giản đồ duy nhất public
, bỏ qua hoàn toàn lớp lược đồ một cách hiệu quả. Tôi đang sử dụng hàng chục lược đồ trên mỗi cơ sở dữ liệu thường xuyên.
Các lược đồ hơi giống (nhưng không hoàn toàn) giống như các thư mục trong hệ thống tệp.
Khi bạn sử dụng nhiều lược đồ, hãy đảm bảo hiểu search_path
cài đặt:
- Cách search_path ảnh hưởng đến độ phân giải của mã nhận dạng và "giản đồ hiện tại"
Đặc quyền mặc định
Theo tài liệu về GRANT
:
PostgreSQL cấp các đặc quyền mặc định trên một số loại đối tượng cho
PUBLIC
. Không có đặc quyền nào được cấp choPUBLIC
theo mặc định trên bảng, cột, lược đồ hoặc không gian bảng. Đối với các loại khác, các đặc quyền mặc định được cấp choPUBLIC
như sau:CONNECT
vàCREATE TEMP TABLE
cho cơ sở dữ liệu;EXECUTE
đặc quyền cho các chức năng; vàUSAGE
đặc quyền cho các ngôn ngữ.
Tất cả các giá trị mặc định này có thể được thay đổi bằng ALTER DEFAULT PRIVILEGES
:
- Cấp tất cả trên một lược đồ cụ thể trong db cho một vai trò nhóm trong PostgreSQL
Vai trò nhóm
Giống như @Craig đã nhận xét, tốt nhất bạn nên GRANT
đặc quyền cho một vai trò nhóm và sau đó tạo thành viên người dùng cụ thể của vai trò đó (GRANT
vai trò nhóm đối với vai trò người dùng). Bằng cách này, việc xử lý và thu hồi các gói đặc quyền cần thiết cho một số tác vụ sẽ đơn giản hơn.
Vai trò nhóm chỉ là một vai trò khác mà không cần đăng nhập. Thêm thông tin đăng nhập để chuyển nó thành vai trò người dùng. Thêm:
- Tại sao PostgreSQL hợp nhất người dùng và nhóm thành vai trò?
Các vai trò được xác định trước
Cập nhật: Postgres 14 trở lên thêm các vai trò mới được xác định trước (chính thức là "vai trò mặc định") pg_read_all_data
và pg_write_all_data
để đơn giản hóa một số điều bên dưới. Xem:
- Cấp quyền truy cập vào tất cả các bảng của cơ sở dữ liệu
Công thức
Giả sử, chúng ta có một cơ sở dữ liệu mới mydb
, một nhóm mygrp
và một người dùng myusr
...
Khi được kết nối với cơ sở dữ liệu được đề cập dưới dạng superuser (postgres
ví dụ):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
Để chỉ định "một người dùng tất cả các đặc quyền cho tất cả các bảng" như bạn đã viết (tôi có thể hạn chế hơn):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
Để đặt các đặc quyền mặc định cho các đối tượng trong tương lai, hãy chạy cho mọi vai trò tạo các đối tượng trong lược đồ này:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
Bây giờ, cấp nhóm cho người dùng:
GRANT mygrp TO myusr;
Câu trả lời liên quan:
- PostgreSQL - Người dùng DB chỉ được phép gọi các hàm
Cài đặt thay thế (không chuẩn)
Đến từ MySQL và vì bạn muốn tách biệt các đặc quyền trên cơ sở dữ liệu, bạn có thể thích cài đặt không chuẩn này db_user_namespace
. Theo tài liệu:
Tham số này cho phép tên người dùng trên mỗi cơ sở dữ liệu. Nó bị tắt theo mặc định.
Đọc kỹ hướng dẫn sử dụng. Tôi không sử dụng cài đặt này. Nó không làm mất hiệu lực ở trên.