Liệt kê các đặc quyền cơ sở dữ liệu bằng cách sử dụng psql


142

Tôi đang ở giữa một quá trình di chuyển máy chủ cơ sở dữ liệu và tôi không thể tìm ra (sau khi tìm kiếm và tìm kiếm ở đây) làm thế nào tôi có thể liệt kê các đặc quyền cơ sở dữ liệu (hoặc tất cả các đặc quyền trên máy chủ) trên PostgreQuery bằng psqlcông cụ dòng lệnh?

Tôi đang dùng Ubuntu 11.04 và phiên bản PostgreSQL của tôi là 8.2.x.

Câu trả lời:


116
postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres

Các tài liệu trênGRANT đưa ra một lời giải thích về cách giải thích đầu ra. Đối với các đặc quyền cụ thể trên một bảng của cơ sở dữ liệu hiện tại, sử dụng \z myTable.


5
\z myTablelà hoàn hảo để đảm bảo rằng bạn đã cấp quyền truy cập thành công cho ai đó và tránh trông như một thằng ngốc khi bạn nói "bây giờ nó có hoạt động không? Nó không ??? "
ijoseph 17/07/18

107

có lẽ bạn có nghĩa là liệt kê người dùng và đặc quyền của họ cho cơ sở dữ liệu - Tôi hoàn toàn không thể biết được câu hỏi:

postgres=> \du
                             List of roles
    Role name    |  Attributes  |                    Member of
-----------------+--------------+------------------------------------------------
 dba             | Create role  | {util_user,helpdesk_user,helpdesk_admin}
 helpdesk_admin  | Cannot login | {helpdesk_user}
 helpdesk_user   | Cannot login | {helpdesk_reader}
 jack            |              | {helpdesk_admin}
 postgres        | Superuser    | {}
                 : Create role
                 : Create DB

Không, tôi muốn có một cách liệt kê các đặc quyền của một cơ sở dữ liệu cụ thể, nhưng tôi đã tìm ra nó. Chủ sở hữu của cơ sở dữ liệu luôn có tất cả các đặc quyền, phải không? Và sau đó chúng ta có thể thêm nhiều đặc quyền trên cơ sở dữ liệu cho những người dùng / nhóm khác. Những người được liệt kê với lệnh \ l. Nhưng dù sao cũng cảm ơn rất nhiều.
pedrosanta

80

Bạn có thể làm điều đó bằng cách làm theo:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

Điều này cung cấp cho bạn loại đầu ra này:

mail=# select grantee, privilege_type from information_schema.role_table_grants where table_name='aliases';
   grantee    |  privilege_type
--------------+-----------------
 mailreader   |  INSERT
 mailreader   |  SELECT
 mailreader   |  UPDATE
 mailreader   |  DELETE
 mailreader   |  TRUNCATE
 mailreader   |  REFERENCES
 mailreader   |  TRIGGER
(7 rows)

mail=#

10
Chào mừng đến với trang web! Một câu hỏi nhỏ: tại sao bạn chèn đầu ra dưới dạng ảnh chụp màn hình? Vui lòng sử dụng văn bản bình thường càng thường xuyên càng tốt.
dezso


1
Có cách nào tôi có thể thấy sự cho phép cho trình tự? Điều này chỉ cung cấp thông tin bảng
tò mò

Lưu ý rằng (ít nhất là theo Postgres 9.4) ở trên sẽ không hoạt động đối với các chế độ xem cụ thể.
SeldomNeedy

@HimanshuChauhan nếu tôi thêm một vai trò mới 'new_role' bằng cách sử dụng vai trò 'mailreader', thông tin_schema.role_table_grant có liệt kê new_role không?
Anand

15

Sử dụng psqlcác lệnh meta:

https://www.postgresql.org/docs/civerse/static/app-psql.html

Đi qua trang với Ctrl + F sẽ cho:

\ddp [ pattern ] Liệt kê các thiết lập đặc quyền truy cập mặc định.

\dp [ pattern ] Liệt kê các bảng, dạng xem và trình tự với các đặc quyền truy cập được liên kết của chúng.

\l[+] [ pattern ] Liệt kê các cơ sở dữ liệu trong máy chủ và hiển thị .... quyền truy cập.

Cũng được đề cập ở trên, nhưng không tìm thấy với từ "đặc quyền" trên trang hướng dẫn:

\du+cho các vai trò có đăng nhập và \dg+cho các vai trò không có - sẽ có một tệp "Member of"nơi bạn tìm thấy các vai trò được cấp cho các vai trò.

Tôi cố tình bỏ qua các đặc quyền chức năng và ngôn ngữ ở đây, được tìm thấy trong psqlhướng dẫn sử dụng hầu như không bị thao túng (và nếu bạn sử dụng các đặc quyền đó, bạn sẽ không đến đây để được tư vấn). tương tự đối với các loại, miền do người dùng xác định, v.v. - sử dụng "+" sau lệnh meta sẽ hiển thị cho bạn các đặc quyền nếu có.


Một cách cực kỳ nhỏ để kiểm tra các đặc quyền là thả người dùng trong giao dịch, ví dụ:

s=# begin; drop user x;
BEGIN
Time: 0.124 ms
ERROR:  role "x" cannot be dropped because some objects depend on it
DETAIL:  privileges for type "SO dT"
privileges for sequence so
privileges for schema bin
privileges for table xx
privileges for table "csTest"
privileges for table tmp_x
privileges for table s1
privileges for table test
Time: 0.211 ms
s=# rollback;
ROLLBACK
Time: 0.150 ms

Khi danh sách dài hơn N, (ít nhất là trong 9.3), cảnh báo với danh sách các đặc quyền bị thu hẹp, nhưng bạn vẫn có thể tìm thấy nó đầy đủ trong nhật ký ...


12

Undercovers psql sử dụng truy vấn dưới đây khi bạn đưa ra \dulệnh.

SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;

Là tiêu chuẩn sql này?
ribamar

`" ERROR: cột r.rolbypassrls không tồn tại \ n \ nLINE 9 :, r.rolbypassrls \ n \ n ^ \ n ",` không may không hoạt động
ribamar 31/12/18

10

Một bước bổ sung (có thể rõ ràng) sẽ trở thành người dùng postgres, nếu không bạn có thể gặp lỗi về các vai trò không tồn tại.

sudo su - postgres
psql -l

hoặc là

psql
postgres=> \l

2
Meta: Tôi đang thêm câu hỏi này vì câu hỏi này được đánh giá cao trên truy vấn google "vai trò danh sách postgres" và tôi đã dành một chút thời gian trong các kết quả được xếp hạng thấp hơn nhiều trước khi tôi tìm thấy những gì tôi muốn, vì vậy tôi đang ghi nhớ thông tin bổ sung.
Adam Shostack

-1
-- file: src/sql/pgsql/list-table-priviledges.sql
-- usage:
-- alias psql="PGPASSWORD=${postgres_db_useradmin_pw:-} psql -v -q -t -X -w -U ${postgres_db_useradmin:-}"
-- psql -d dev_qto < src/sql/pgsql/list-table-priviledges.sql | less
SELECT grantee, table_name , privilege_type
FROM information_schema.role_table_grants
WHERE 1=1
AND grantee = 'usrqtoapp'
AND table_name='readme_doc'
;

-- purpose:
-- list the priveledges per user or for user in a database
-- eof file: src/sql/pgsql/list-table-priviledges.sql

đầu ra

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
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.