SỬ DỤNG GRANT trên tất cả các lược đồ trong cơ sở dữ liệu?


12

Tôi muốn GRANT USAGEmột người dùng / vai trò cho một cơ sở dữ liệu nhất định. Cơ sở dữ liệu có nhiều lược đồ.

Tôi biết có một ON ALL TABLES IN SCHEMA, nhưng tôi muốn "tất cả các lược đồ". Tôi đã thử GRANT USAGE .. ON DATABASE, nhưng điều đó rõ ràng là sai (nó không thực sự tồn tại ).

Đây là cho Postgres 9.3 hoặc 9.4, nó là một máy chủ trên AWS RDS.

Câu trả lời:


17

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 WHEREmệ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 GRANTcâu lệnh được xây dựng đến -ctù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 %Ixá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_namespacecó thể được tìm thấy trong pg_cataloglượ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.

1
Tôi tự hỏi nếu bạn có thể mô phỏng các đặc quyền mặc định cho các lược đồ mới được tạo bằng cách sử dụng trình kích hoạt sự kiện tự động chạy grant usagecho lược đồ mới.
a_horse_with_no_name

@a_horse_with_no_name nghĩ về nó, tôi thấy hiện tại không có lý do tại sao nó không thể được thực hiện.
dezso

0

Bạn có thể sử dụng quá.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.