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

PostgreSQL 8.4 cấp các đặc quyền DML trên tất cả các bảng cho một vai trò

Tôi cũng muốn khoản trợ cấp này sẽ tiếp tục tồn tại cho việc tạo bảng mới trong tương lai. [...] Tôi đã tìm kiếm tài liệu và dường như không thể tìm ra giải pháp phù hợp.

Bởi vì trước 9.0 không có. Tất cả những gì bạn có thể nhận là đặt quyền cho hiện có những cái bàn. Bạn phải thực hiện một GRANT cho mỗi bảng, vì trước 9.0 không có chế độ "số lượng lớn". Xem SQL grammer cho 8.4 và 9.0:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

và 9.0 tại đây:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

ALL TABLES IN SCHEMA mới một phần là thứ bạn đang thiếu.

Ngoài ra:Đặt quyền trên cấp cơ sở dữ liệu như trong câu hỏi của bạn sẽ không giúp ích được gì cho bạn:Bạn sẽ "chỉ" đặt quyền trên cơ sở dữ liệu của anh ta, chứ không phải trên bất kỳ thứ "chứa" nào như bảng. Phần liên quan:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Có nghĩa là bạn chỉ có thể đặt CREATE , CONNECTTEMP quyền trên chính cơ sở dữ liệu nhưng không có SELECT , INSERT vv

Cho đến nay cho những thứ tồi tệ. Những gì bạn có thể làm là những thứ sau:

  • Giảm số lượng quản lý quyền bằng cách cấp quyền không phải cho người dùng mà cho các vai trò. Sau đó, thêm vai trò cho người dùng cá nhân. Khi một bảng mới được tạo, bạn chỉ cần điều chỉnh một hoặc hai vai trò chứ không cần điều chỉnh hàng trăm người dùng.

  • Truy vấn danh mục hệ thống và tạo GRANT thích hợp các lệnh. Lưu chúng vào một tệp và thực thi tệp đó. Điều này sẽ giúp bạn khởi động dễ dàng hơn.

Một truy vấn như vậy có thể trông giống như sau:

select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;' 
from information_schema.tables 
where 
    table_type = 'BASE TABLE' and 
    table_schema not in ('pg_catalog', 'information_schema');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. biểu thức chính quy quốc tế hóa trong postgresql

  2. Cách khai báo biến trong PostgreSQL

  3. Nhận NoSuchMethodError:javax.persistence.Table.indexes () khi thực hiện truy vấn JPA

  4. Các giải pháp khả dụng cao của PG Clustering hàng đầu cho PostgreSQL

  5. Làm cách nào để thay đổi định dạng ngày trong Postgres?