Postgresql

什麼時候在 l 中列出了特權,什麼時候沒有?

  • August 13, 2015

\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 中管理權限

希望有幫助。=)

引用自:https://dba.stackexchange.com/questions/110848