psqlを使用してデータベース権限を一覧表示します


142

私はデータベースサーバーの移行の途中で、psqlコマンドラインツールを使用してPostgreSQLのデータベース権限(またはサーバー全体のすべての権限)をどのようにリストできますか?

Ubuntu 11.04を使用しています。PostgreSQLバージョンは8.2.xです。

回答:


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

ドキュメントでGRANTは、出力の解釈方法について説明しています。現在のデータベースのテーブルに対する特定の特権については、を使用します\z myTable


5
\z myTableあなたが言うとき、あなたは成功した誰かへのアクセスを許可していることを確実にすることと、馬鹿のように見える避けるために完全である、「大丈夫、それが今で動作しないことは?んではない???
ijoseph

107

おそらく、データベースのユーザーとその特権をリストすることを意味します-私は質問からはまったくわかりません:

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

いいえ、特定のデータベースの特権を一覧表示する方法が必要でしたが、すでにわかっています。データベースの所有者には常にすべての権限がありますよね?その後、データベースに対する他の権限を他のユーザー/グループに追加できます。それらは\ lコマンドでリストされます。とにかくどうもありがとう。
ペドロサンタ

80

次の方法でこれを実行できます。

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

これにより、次のような出力が得られます。

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
サイトへようこそ!小さな質問:出力をスクリーンショットとして挿入したのはなぜですか?できるだけ頻繁に通常のテキストを使用してください。
-dezso


1
シーケンスの許可を確認する方法はありますか?これはテーブル情報のみを提供します
好奇心

(少なくともPostgres 9.4では)上記はマテリアライズドビューでは機能しないことに注意してください。
SeldomNeedy

@HimanshuChauhanロール「mailreader」を使用して新しいロール「new_role」を追加すると、information_schema.role_table_grantsにもnew_roleがリストされますか?
アナンド

15

psqlメタコマンドの使用:

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

Ctrl + Fでページを移動すると、次の結果が得られます。

\ddp [ pattern ] デフォルトのアクセス権限設定をリストします。

\dp [ pattern ] テーブル、ビュー、およびシーケンスを、それらに関連付けられたアクセス特権とともにリストします。

\l[+] [ pattern ] サーバー内のデータベースをリストし、... ...アクセス権限を表示します。

上記にも記載されていますが、マニュアルページに「privileges」という単語がありません。

\du+ログイン\dg+があるロールとないロールの場合- "Member of"ロールに付与されたロールを見つける場所があります。

私はここでは意図的に機能と言語の特権をスキップしますが、psqlマニュアルではほとんど操作されていません(これらの特権を使用する場合は、アドバイスを求めてここに来ることはありません)。ユーザー定義タイプ、ドメインなどについても同じです-メタコマンドの後に「+」を使用すると、必要に応じて特権が表示されます。


権限を確認する少し極端な方法は、トランザクションでユーザーを削除することです。例:

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

リストがNよりも長い場合(少なくとも9.3では)、特権のリストを含む警告は折りたたまれますが、ログで完全なリストを見つけることができます...


12

Undercovers psqlは、\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;

これはSQL標準ですか?
リバマー

` "ERROR:、r.rolbypassrls \ N \ N ^ \ nの:列r.rolbypassrlsは、\ nは\ n行9が存在しない"、`残念ながら動作しません
ribamar

10

(おそらく明らかな)追加のステップがpostgresユーザーになります。そうしないと、存在しないロールに関するエラーが発生する可能性があります。

sudo su - postgres
psql -l

または

psql
postgres=> \l

2
Meta:この質問はGoogleクエリ「postgres list roles」で高く評価されているので、これを追加します。必要なものを見つける前に、かなり低いランクの結果に少し時間を費やしました。
アダムショースタック

-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

出力

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.