特権はいつ\ lにリストされ、いつリストされませんか?


10

\ lによってアクセス権限がリストされるのはいつですか、そうでない場合はいつですか?\ lで一覧表示されるアクセス権限は、付与後に変更され、取り消される場合があります。

$ createuser -EP my_readonly
$ psql development
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
...
development=# grant usage on schema public to my_readonly;
development=# grant connect on database development to my_readonly;
development=# \l
                                             List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |     Access privileges      
-----------------------------+----------+----------+-------------+-------------+----------------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant               +
                             |          |          |             |             | vagrant=CTc/vagrant       +
                             |          |          |             |             | my_readonly=c/vagrant
...
development=# revoke connect on database development from my_readonly;
REVOKE
development=# revoke usage on schema public from my_readonly;
REVOKE
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant          +
                             |          |          |             |             | vagrant=CTc/vagrant

何故ですか?どの状態が変化しましたか?(私はPUBLICロールが接続権限を持っている推測しているので)私は、接続にmy_readonlyユーザの能力は、この全体のpsqlのセッションを通じて変化しなかったと信じていますが、はっきりと何かが変更されました:そのことは何ですか?

副次的な質問:PUBLICに実際に接続特権があるかどうかをpostgresに明示的に問い合わせるにはどうすればよいですか(それらは取り消されている可能性があります- 新しいユーザーが任意のテーブルから選択できる理由を参照してください)?

回答:


4

psqlのバックスラッシュコマンドは、システムカタログを調べるクエリのショートカットです。この\lコマンドはpg_catalog.pg_database、特に次のクエリの情報を調べます。

SELECT d.datname as "Name",
   pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
   pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
   d.datcollate as "Collate",
   d.datctype as "Ctype",
   pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;

コマンドラインで呼び出すときにフラグをpsql渡すことにより、バックスラッシュコマンドに何が使用されているかを示すことができます-E

データベースまたは他のオブジェクトの権限がPostgreSQLがそれらを作成する際のデフォルトである場合、*acl列はになりますNULL。デフォルトを変更すると、ACL列に、実行したステートメントGRANTREVOKEステートメントに関連する情報が入力されます。

\zまたはのいずれかを使用して、アクセス許可/ ACLを具体的に確認できます。\dp

ここでさらに読む場合:

http://www.postgresql.org/docs/9.4/static/sql-grant.html

下にスクロールする(または単語を検索するpsql)と\l、ACL列またはACL列に表示されるACLの解釈方法を示す表を見ることができます。

例えば:

=Tc/vagrant

ACL行はPUBLICに適用される権限を示し、その特定のロールに適用されるため、PUBLIC(すべてのロールを含む暗黙のロール)には一時テーブルを作成Tして接続する権限があることを意味します。c=xxxxxrolname=xxxx

Daliboからのこのプレゼンテーションは、これをさらに明確にするのにも役立ちます:PostgreSQLでの権利の管理

お役に立てば幸いです。=)

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