Bạn có ít nhất hai lựa chọn.
Cái đầu tiên sử dụng một truy vấn nhỏ và một trình soạn thảo văn bản. Chúng tôi phải thu thập các schemata quan tâm của chúng tôi:
SELECT nspname
FROM pg_namespace;
Bạn có thể thêm một WHERE
mệnh đề nếu bạn muốn giới hạn phạm vi. Sao chép đầu ra và sửa đổi nó, để bạn nhận được một số GRANT USAGE ON SCHEMA ... TO your_role;
lệnh. Sau đó, chỉ cần cho nó ăn psql
, ví dụ:
psql -f multigrant.sql
Một biến thể thông thường của điều này có thể là một tập lệnh shell lặp lại các tên và lệnh gọi được thu thập psql
, chuyển GRANT
câu lệnh được xây dựng đến -c
tùy chọn.
Giải pháp khác về cơ bản giống như vậy trong một khối pl / pssql, xây dựng một truy vấn động. Cốt lõi là như nhau - chúng ta phải thu thập schemata. Sau đó, chúng tôi lặp lại tất cả chúng, cấp lược đồ quyền theo lược đồ:
DO $do$
DECLARE
sch text;
BEGIN
FOR sch IN SELECT nspname FROM pg_namespace
LOOP
EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
END LOOP;
END;
$do$;
Ghi chú :
- Không giống như các bảng, trình tự, hàm và loại, người ta không thể đặt các đặc quyền mặc định cho schemata (kể từ 9.4). Bạn sẽ phải cấp đặc quyền này cho bất kỳ lược đồ mới được thêm bằng tay.
- Ở đây tôi đang sử dụng trích dẫn đô la khi xây dựng truy vấn động. Điều này cho phép tôi sử dụng cú pháp 'bình thường', trái ngược với nhân các dấu ngoặc đơn, chẳng hạn (không có trong ví dụ này). Bằng cách này, hầu hết các biên tập viên sẽ làm nổi bật các tuyên bố độc đáo.
- Tôi cũng sử dụng
format()
với trình %I
xác định định dạng để có tên đối tượng được trích dẫn chính xác nếu cần thiết. Cách tiếp cận này dễ đọc hơn nhiều so với việc xây dựng truy vấn với nối các hằng chuỗi và một số quote_ident()
lệnh gọi.
pg_namespace
có thể được tìm thấy trong pg_catalog
lược đồ. Kiểm tra các đối tượng khác trong đó - chúng lưu trữ mọi khía cạnh của lược đồ, bảng của bạn, v.v.
grant usage
cho lược đồ mới.