Psql kullanarak veritabanı ayrıcalıklarını listeleyin


142

Bir veritabanı sunucusu geçişinin ortasındayım ve (burada arama yaptıktan ve arama yaptıktan sonra) psqlkomut satırı aracını kullanarak PostgreSQL'de veritabanı ayrıcalıklarını (veya sunucudaki tüm ayrıcalıkları) nasıl listeleyebilirim ?

11.04 Ubuntu'dayım ve PostgreSQL sürümüm 8.2.x.

Yanıtlar:


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

Üzerinde dokümanlarGRANT çıktı yorumlamak nasıl bir açıklama yapar. Geçerli veritabanındaki bir tablodaki belirli ayrıcalıklar için kullanın \z myTable.


5
\z myTablederken başarıyla birine erişim verdiğinizi sağlanması ve aptal gibi bakıyor önlemek için idealdir "tamam şimdi çalışıyor o? etmez ??? "
ijoseph

107

belki de kullanıcıları ve bir veritabanı için ayrıcalıklarını listelemeyi kastediyorsunuz.

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

Hayır, belirli bir veritabanının ayrıcalıklarını listelemek için bir yol istedim, ancak çoktan anladım. Veritabanının sahibi her zaman tüm haklara sahiptir, değil mi? Daha sonra veritabanındaki diğer kullanıcılara / gruplara daha fazla ayrıcalık ekleyebiliriz. Bunlar \ l komutuyla listelenir. Ama yine de çok teşekkürler.
pedrosanta

80

Bunu takip ederek yapabilirsiniz:

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

Bu size bu tür çıktılar verir:

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
Siteye Hoşgeldiniz! Küçük bir soru: Neden çıktıyı ekran görüntüsü olarak eklediniz? Lütfen normal metni mümkün olduğunca sık kullanın.
dezso


1
Dizilerin iznini görebileceğim bir yol var mı? Bu yalnızca tablo bilgilerini verir
meraklı

Unutmayın ki (en azından 9.4 altında) yukarıdakiler somutlaştırılmış görüşler için işe yaramayacaktır.
SeldomNeedy

@HimanshuChauhan, 'mailreader' rolünü kullanarak 'new_role' yeni bir rol eklersem, information_schema.role_table_grants da new_role'u listeler mi?
Anand,

15

psqlMeta komutları kullanarak :

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

Ctrl + F ile sayfanın üzerinden geçerken:

\ddp [ pattern ] Varsayılan erişim ayrıcalık ayarlarını listeler.

\dp [ pattern ] Tabloları, görünümleri ve dizileri ilişkili erişim haklarıyla listeler.

\l[+] [ pattern ] Sunucudaki veritabanlarını listele ve .... erişim ayrıcalıklarını göster.

Ayrıca yukarıda belirtilen, ancak el kitabındaki sayfada "ayrıcalıklar" kelimesiyle bulunamamıştır:

\du+Oturum \dg+açmış ve rolleri olmayan roller için - "Member of"rollere verilen rolleri bulacağınız bir dosyaya sahip olacaktır .

Burada işlev ve dil ayrıcalıklarını kasıtlı olarak atlıyorum, psqlkılavuzda zorlukla manipüle edilmiş olarak buldum (ve bu ayrıcalıkları kullanırsanız buraya bir tavsiye için gelmezsiniz). kullanıcı tanımlı türler, alanlar ve benzerleri için aynı - meta komutundan sonra "+" kullanılması, varsa ayrıcalıkları gösterecektir.


Ayrıcalıkları kontrol etmenin ufak bir yolu kullanıcıyı işlemdeki bırakıyor, örneğin:

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

Liste N’den uzun olduğunda, (en azından 9.3’te), ayrıcalıklar listesi ile uyarı daraltılır, ancak yine de günlüklerde tam olarak bulabilirsiniz ...


12

Undercovers psql komutu verirken feryat sorgusunu kullanır \du.

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;

Bu sql standart mı?
ribamar

`" HATA: sütun r.rolbypassrls yok \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n ",` maalesef çalışmıyor
ribamar

10

A (muhtemelen açık) ek bir adım postgres kullanıcısı olur, aksi takdirde mevcut olmayan roller hakkında hatalar alabilirsiniz.

sudo su - postgres
psql -l

veya

psql
postgres=> \l

2
Meta: Bunu ekliyorum çünkü bu soru "postgres list roller" adlı Google sorgusunda yüksek puan aldı ve istediğimi bulmadan önce çok daha düşük dereceli sonuçlarda biraz zaman harcadım.
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

çıktı

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.