web-dev-qa-db-ja.com

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

\ 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

何故ですか?どのような状態に変化しましたか? my_readonlyユーザーの接続機能は、このpsqlセッション全体を通して変更されていないと思います(私はPUBLICロールに接続権限があると推測しているため)、明らかに何か変更:それは何ですか?

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

10
Croad Langshan

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;

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

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

\zまたは\dpを使用して、アクセス許可/ ACLを確認できます

ここでさらに読む場合:

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

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

例えば:

=Tc/vagrant

つまり、ACL行=xxxxxはPUBLICに適用される権限を示し、rolname=xxxxはその特定の役割に適用されるため、PUBLIC(すべての役割を含む暗黙の役割)は一時テーブルTを作成してcに接続する権限を持っています。

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

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

4
Kassandry