\ 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に明示的に質問するにはどうすればよいですか(取り消された可能性があります-参照 なぜ新しいユーザーが任意のテーブルから選択しますか? )?
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での権利の管理
お役に立てば幸いです。 =)