Когда привилегии перечислены в \ 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

Это почему? Какое состояние изменилось? Я полагаю, что способность пользователя my_readonly к подключению не изменилась в течение всего сеанса psql (поскольку я предполагаю, что роль PUBLIC имеет привилегии подключения), но однозначно что-то изменилось: что это за штука?

Боковой вопрос: как я могу явно задать Postgres ли PUBLIC на самом деле это имеет привилегии CONNECT (они могут быть отозваны - см Почему новый пользователь может выбрать из любой таблицы? )?

Croad Langshan
источник

Ответы:

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 будет заполнен информацией, связанной с GRANTи / или REVOKEутверждениями, которые вы выполняли.

Вы можете просмотреть разрешения / ACL , в частности , с помощью либо \zили\dp

Если вы читаете дальше здесь:

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

Если вы прокрутите вниз (или psqlвыполните поиск по слову ), вы можете взглянуть на таблицу, в которой показано, как интерпретировать списки ACL, которые вы видите с помощью \lили в столбце ACL.

Например:

=Tc/vagrant

означает, что PUBLIC (неявная роль, содержащая все роли) имеет разрешения на создание временных таблиц Tи подключение c, поскольку строка ACL =xxxxxобозначает разрешения, применяемые к PUBLIC, а rolname=xxxxприменяется к этой конкретной роли.

Эта презентация от Dalibo также должна помочь прояснить это далее: Управление правами в PostgreSQL

Надеюсь, это поможет. знак равно

Кассандры
источник