Daftar keistimewaan database menggunakan psql

144

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 psqlalat baris perintah?

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

pedrosanta
sumber

Jawaban:

117
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

DokumenGRANT - dokumen pada memberikan penjelasan tentang bagaimana menafsirkan output. Untuk hak khusus pada tabel database saat ini, gunakan \z myTable.

DrColossos
sumber
5
\z myTablesangat cocok untuk memastikan bahwa Anda telah berhasil memberikan akses ke seseorang dan menghindari terlihat seperti orang bodoh ketika Anda mengatakan "oke apakah itu bekerja sekarang? itu tidak ??? "
ijoseph
109

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
Jack Douglas
sumber
Tidak, saya ingin cara untuk membuat daftar hak istimewa dari database tertentu, tetapi saya sudah menemukan jawabannya. Pemilik basis data selalu memiliki semua hak istimewa, bukan? Dan setelah itu kita dapat menambahkan lebih banyak hak istimewa pada database ke pengguna / grup lain. Itu terdaftar dengan perintah \ l. Tapi terima kasih banyak.
pedrosanta
80

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=#
Himanshu Chauhan
sumber
10
Selamat datang di situs ini! Satu pertanyaan kecil: mengapa Anda memasukkan output sebagai tangkapan layar? Harap gunakan teks normal sesering mungkin.
dezso
1
Apakah ada cara saya bisa melihat izin untuk urutan? Ini hanya memberikan informasi tabel
ingin tahu
Perhatikan bahwa (paling tidak pada Postgres 9.4) hal di atas tidak akan berfungsi untuk pandangan terwujud.
SeldomNeedy
@HimanshuChauhan jika saya menambahkan peran baru 'new_role' menggunakan peran 'mailreader', akankah information_schema.role_table_grants daftar new_role juga?
Anand
15

Menggunakan psqlmeta-perintah:

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 mereka.

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

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

\du+untuk peran dengan login dan \dg+untuk peran tanpa - akan memiliki arsip di "Member of"mana Anda menemukan peran yang diberikan kepada peran.

Saya sengaja mengabaikan hak istimewa fungsi dan bahasa di sini, ditemukan dalam psqlmanual sebagai 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, misalnya:

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 ...

Vao Tsun
sumber
12

Undercovers psql menggunakan kueri di bawah ini ketika Anda mengeluarkan \duperintah.

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;
Dennis
sumber
Apakah standar sql ini?
ribamar
`" KESALAHAN: kolom r.rolbypassrls tidak ada \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n ",` sayangnya tidak berfungsi
ribamar
10

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
Adam Shostack
sumber
2
Meta: Saya menambahkan ini karena pertanyaan ini sangat berperingkat pada kueri google "peran daftar postgres" dan saya menghabiskan sedikit waktu dalam hasil peringkat jauh lebih rendah sebelum saya menemukan apa yang saya inginkan, jadi saya mengenang info tambahan.
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

keluaran

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Yordan Georgiev
sumber