PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cấp đặc quyền cho một cơ sở dữ liệu cụ thể trong PostgreSQL

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 cho PUBLIC 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 cho PUBLIC như sau:CONNECTCREATE 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_datapg_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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chế độ ngủ đông lưu Mô hình người dùng vào Postgres

  2. PostgreSQL giải thích cho tôi biết chính xác là gì?

  3. Chuyển đổi các truy vấn SELECT DISTINCT ON từ Postgresql sang MySQL

  4. Cách chèn dữ liệu vào bảng bằng các thủ tục được lưu trữ trong postgresql

  5. Cấp đặc quyền cho các bảng trong tương lai trong PostgreSQL?