Postgresql
什麼時候在 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 角色具有連接權限),但顯然有些改變:那是什麼?
附帶問題:我如何明確詢問 postgres PUBLIC 實際上是否具有連接權限(它們可能已被撤銷 - 請參閱為什麼新使用者可以從任何表中選擇?)?
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 列將填充與您執行的GRANT
和/或REVOKE
語句相關的資訊。您可以通過以下任一方式查看權限/ACL
\z
或\dp
如果您在此處進一步閱讀:
http://www.postgresql.org/docs/9.4/static/sql-grant.html
如果向下滾動(或搜尋單詞
psql
),您可以查看該表,該表向您展示如何解釋您\l
在 ACL 列中或在 ACL 列中看到的 ACL。例如:
=Tc/vagrant
表示 PUBLIC(包含所有角色的隱式角色)具有創建臨時表
T
和連接c
的權限,因為 ACL 行=xxxxx
表示應用於 PUBLIC 的權限,而rolname=xxxx
應用於該特定角色。Dalibo 的這個展示文稿也應該有助於進一步澄清這一點:在 PostgreSQL 中管理權限
希望有幫助。=)