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

Làm cách nào để bạn tạo một người dùng chỉ đọc trong PostgreSQL?

Cấp quyền sử dụng / chọn cho một bảng duy nhất

Nếu bạn chỉ cấp CONNECT cho cơ sở dữ liệu, người dùng có thể kết nối nhưng không có đặc quyền nào khác. Bạn phải cấp USAGE trên các không gian tên (lược đồ) và CHỌN trên các bảng và dạng xem riêng lẻ như vậy:

GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;

Nhiều bảng / chế độ xem (PostgreSQL 9.0+)

Trong các phiên bản PostgreSQL mới nhất, bạn có thể cấp quyền trên tất cả các bảng / chế độ xem / v.v. trong lược đồ bằng cách sử dụng một lệnh duy nhất thay vì phải gõ từng cái một:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Điều này chỉ ảnh hưởng đến các bảng đã được tạo. Mạnh mẽ hơn, bạn có thể tự động gán các vai trò mặc định cho các đối tượng mới trong tương lai:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

Lưu ý rằng theo mặc định, điều này sẽ chỉ ảnh hưởng đến các đối tượng (bảng) được tạo bởi người dùng đã ban hành lệnh này:mặc dù nó cũng có thể được đặt trên bất kỳ vai trò nào mà người dùng phát hành là thành viên. Tuy nhiên, bạn không nhận các đặc quyền mặc định cho tất cả các vai trò mà bạn là thành viên khi tạo các đối tượng mới ... vì vậy vẫn có một số vấn đề xung quanh. Nếu bạn áp dụng cách tiếp cận rằng cơ sở dữ liệu có vai trò sở hữu và các thay đổi lược đồ được thực hiện với vai trò sở hữu đó, thì bạn nên gán các đặc quyền mặc định cho vai trò sở hữu đó. IMHO, điều này hơi khó hiểu và bạn có thể cần thử nghiệm để đưa ra quy trình làm việc đúng chức năng.

Nhiều bảng / chế độ xem (các phiên bản PostgreSQL trước 9.0)

Để tránh lỗi khi thay đổi nhiều bảng, dài dòng, bạn nên sử dụng quy trình 'tự động' sau để tạo GRANT SELECT bắt buộc vào mỗi bảng / chế độ xem:

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');

Điều này sẽ xuất ra các lệnh GRANT có liên quan để GRANT SELECT trên tất cả các bảng, dạng xem và chuỗi ở chế độ công khai, cho tình yêu sao chép-n-dán. Đương nhiên, điều này sẽ chỉ được áp dụng cho các bảng đã được tạo.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách timeofday () hoạt động trong PostgreSQL

  2. Hệ thống lại khóa ngoại cho các trường

  3. Khoảng thời gian động (Dựa trên cột)

  4. Đặt vĩnh viễn đường dẫn lược đồ Postgresql

  5. Bật hỗ trợ PostgreSQL trong PHP trên Mac OS X