Cung cấp tất cả các quyền cho người dùng trên DB


206

Tôi muốn cung cấp cho người dùng tất cả các quyền trên cơ sở dữ liệu mà không cần quản trị viên. Lý do tại sao tôi muốn làm điều đó là tại thời điểm DEV và PROD là các DB khác nhau trên cùng một cụm vì vậy tôi không muốn người dùng có thể thay đổi các đối tượng sản xuất nhưng nó phải có thể thay đổi các đối tượng trên DEV.

Tôi đã thử:

grant ALL on database MY_DB to group MY_GROUP;

nhưng nó dường như không cho phép bất kỳ.

Sau đó tôi đã thử:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

và nó dường như cho phép tôi tạo các đối tượng nhưng không truy vấn \ xóa các đối tượng trên lược đồ đó thuộc về người dùng khác

Tôi có thể tiếp tục bằng cách cấp quyền SỬ DỤNG cho người dùng trên MY_SCHema nhưng sau đó họ sẽ phàn nàn về việc không có quyền trên bàn ...

Vì vậy, tôi đoán câu hỏi của tôi là: có cách nào dễ dàng để cung cấp tất cả các quyền cho người dùng trên DB không?

Tôi đang làm việc trên PostgreSQL 8.1.23.

Câu trả lời:


271

Người dùng cần truy cập vào cơ sở dữ liệu , rõ ràng:

GRANT CONNECT ON DATABASE my_db TO my_user;

Và (ít nhất) USAGEđặc quyền trên lược đồ :

GRANT USAGE ON SCHEMA public TO my_user;

Hoặc cấp USAGEcho tất cả các lược đồ tùy chỉnh:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Sau đó, tất cả các quyền cho tất cả các bảng (yêu cầu Postgres 9.0 trở lên).
Và đừng quên trình tự (nếu có):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Đối với các phiên bản cũ hơn, bạn có thể sử dụng "Trình hướng dẫn cấp" của pgAdmin III (GUI mặc định).

Có một số đối tượng khác, hướng dẫn sử dụngGRANT có danh sách đầy đủ kể từ Postgres 12:

đặc quyền trên một đối tượng cơ sở dữ liệu (bảng, cột, dạng xem, bảng ngoại, chuỗi, cơ sở dữ liệu, trình bao bọc dữ liệu nước ngoài, máy chủ nước ngoài, hàm, thủ tục, ngôn ngữ thủ tục, lược đồ hoặc vùng bảng)

Nhưng phần còn lại hiếm khi cần thiết. Thêm chi tiết:

Xem xét nâng cấp lên phiên bản hiện tại .


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

24
Cấp tất cả các đặc quyền ON DATABASEnghe có vẻ hùng mạnh, nhưng nó không làm được gì nhiều. Đó chỉ là một sự khởi đầu. Nó không cấp bất kỳ đặc quyền trên các đối tượng có chứa.
Erwin Brandstetter

49

Trong PostgreSQL 9.0+, bạn sẽ làm như sau:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

Nếu bạn cũng muốn bật tính năng này cho các mối quan hệ mới được tạo, thì hãy đặt quyền mặc định:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

Tuy nhiên, thấy rằng bạn sử dụng 8.1, bạn phải tự viết mã:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

Điều này sẽ đặt các đặc quyền trên tất cả các mối quan hệ: bảng, dạng xem, chỉ mục, chuỗi, v.v. Nếu bạn muốn hạn chế điều đó, hãy lọc pg_class.relkind. Xem tài liệu pg_group để biết chi tiết.

Bạn nên chạy chức năng này như siêu người dùng và thường xuyên như ứng dụng của bạn yêu cầu. Một tùy chọn sẽ là gói này trong một công việc định kỳ thực hiện mỗi ngày hoặc mỗi giờ.


Xin chào Patrick, "TẤT CẢ CÁC BẢNG" không khả dụng trên 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) Tôi biết tôi có thể lặp qua các bảng và cấp quyền riêng lẻ, nhưng đây là những gì tôi cố gắng tránh nhưng cảm ơn vì sự giúp đỡ của bạn
Diego

@Diego: Đã thêm giải pháp cho 8.1
Patrick

cảm ơn patrick, cuối cùng tôi đã sử dụng một cái gì đó giống như bạn đã làm nhưng không sử dụng "GRANT ALL". Vì một số lý do, nó dường như không làm gì cả. Đối với exampe, tôi đã chạy: cấp TẤT CẢ cho kiểm tra lược đồ cho userA; nhưng sau đó userA vẫn không có quyền truy cập để đọc từ các bảng trong kiểm tra lược đồ
Diego

2
Bạn nên sử dụng GRANT trên một lược đồ. Sau đó, trên tất cả các mối quan hệ trong lược đồ đó (bảng, dạng xem, trình tự, chỉ mục, v.v.), bạn phải GRANT CHỌN, CHERTN, CẬP NHẬT, XÓA, TRUNCATE riêng. Các lược đồ là không gian tên, quan hệ là nơi dữ liệu của bạn nằm.
Patrick

28

Tôi đã làm như sau để thêm một vai trò 'eSumit' trên cơ sở dữ liệu PostgreQuery 9.4.15 và cung cấp tất cả quyền cho vai trò này:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

Cũng đã kiểm tra các mục nhập pg_table qua:

chọn * từ pg_roles; nhập mô tả hình ảnh ở đây

Ảnh chụp truy vấn cơ sở dữ liệu: nhập mô tả hình ảnh ở đây


Tôi có Postgres phiên bản 10.3 và nó đưa ra lỗi cú pháp khi tôi sử dụng dấu ngoặc kép quanh tên cơ sở dữ liệu.
sajid
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.