it-swarm.asia

Daftar keistimewaan basis data menggunakan psql

Saya berada di tengah-tengah migrasi server basis data dan saya tidak dapat menemukan (setelah googling dan mencari di sini) bagaimana saya bisa mendaftar hak istimewa basis data (atau semua hak istimewa di seluruh server) pada PostgreSQL menggunakan psql alat baris perintah?

Saya menggunakan Ubuntu 11.04 dan versi PostgreSQL saya adalah 8.2.x.

163
pedrosanta
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

The docs on GRANT memberikan penjelasan tentang bagaimana menafsirkan output. Untuk hak khusus pada tabel database saat ini, gunakan \z myTable.

134
DrColossos

mungkin maksud Anda daftar pengguna dan hak istimewa mereka untuk database - Saya tidak bisa mengatakannya dari pertanyaan:

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

Anda dapat melakukannya dengan mengikuti:

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

Ini memberi Anda jenis output:

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=#
94
Himanshu Chauhan

Menggunakan psql meta-commands:

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

Pergi ke halaman dengan Ctrl + F memberi:

\ddp [ pattern ] Daftar pengaturan hak akses standar.

\dp [ pattern ] Daftar tabel, tampilan dan urutan dengan hak akses terkait.

\l[+] [ pattern ] Daftar database di server dan tampilkan .... hak akses.

Disebutkan di atas, tetapi tidak ditemukan dengan "hak istimewa" Word pada halaman manual:

\du+ untuk peran dengan login dan \dg+ untuk peran tanpa - akan mengajukan "Member of" tempat Anda menemukan peran yang diberikan ke peran.

Saya sengaja mengabaikan hak istimewa fungsi dan bahasa di sini, ditemukan di manual psql hampir tidak dimanipulasi (dan jika Anda memang menggunakan hak istimewa itu, Anda tidak akan datang ke sini untuk meminta saran). sama untuk tipe, domain, dan sebagainya yang ditentukan pengguna - menggunakan "+" setelah meta-command akan menunjukkan kepada Anda hak istimewa jika berlaku.


Sedikit cara ekstrem untuk memeriksa hak istimewa adalah menjatuhkan pengguna dalam transaksi, mis .:

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

Ketika daftar lebih panjang dari N, (setidaknya dalam 9,3), peringatan dengan daftar hak istimewa diciutkan, tetapi Anda masih dapat menemukannya penuh di log ...

18
Vao Tsun

Undercovers psql menggunakan kueri di bawah ini ketika Anda menerbitkan \du perintah.

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;
13
Dennis

Langkah tambahan (mungkin jelas) adalah menjadi pengguna postgres, jika tidak, Anda mungkin mendapatkan kesalahan tentang peran yang tidak ada.

Sudo su - postgres
psql -l

atau

psql
postgres=> \l
10
Adam Shostack

Ini adalah permintaan saya yang terdiri dari beberapa jawaban untuk pertanyaan ini:

SELECT grantee AS user, CONCAT(table_schema, '.', table_name) AS table, 
    CASE 
        WHEN COUNT(privilege_type) = 7 THEN 'ALL'
        ELSE ARRAY_TO_STRING(ARRAY_AGG(privilege_type), ', ')
    END AS grants
FROM information_schema.role_table_grants
GROUP BY table_name, table_schema, grantee;

Ini menghasilkan sesuatu seperti ini:

+------+--------------+----------------+
| user |    table     |     grants     |
+------+--------------+----------------+
| foo  | schema.table | ALL            |
| bar  | schema.table | SELECT, INSERT |
+------+--------------+----------------+
0
stefannienhuis