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
, CONNECT
và TEMP
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');