¿Cuándo se enumeran los privilegios en \ ly cuándo no?


10

¿Cuándo se enumeran los privilegios de acceso por \ l y cuándo no? Los privilegios de acceso enumerados por \ l pueden cambiar después de una concesión y revocar:

$ 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

¿Porqué es eso? ¿Qué estado cambió? Creo que la capacidad de conexión de my_readonly del usuario no cambió durante toda esta sesión de psql (porque supongo que el rol PUBLIC tiene privilegios de conexión), pero claramente algo cambió: ¿qué es eso?

Pregunta al margen: ¿cómo puedo pedir explícitamente postgres ya sea pública, de hecho, no tiene privilegios de conexión (que pueden haber sido revocado - ver qué puede seleccionar un nuevo usuario desde cualquier mesa? )?

Respuestas:


4

Los comandos de barra diagonal inversa en psql son accesos directos para una consulta o consultas que examinan los catálogos del sistema. El \lcomando analiza la información en pg_catalog.pg_database, específicamente, esta consulta:

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;

Puede hacer que se psqlmuestre lo que está utilizando para los comandos de barra diagonal inversa pasándole el -Eindicador cuando lo invoque en la línea de comandos.

Si los permisos en una base de datos u otro objeto son los valores predeterminados con los que PostgreSQL los crea, la *aclcolumna lo será NULL. Si cambia los valores predeterminados, como lo hizo, la columna ACL se completará con información relacionada con las declaraciones GRANTy / o REVOKEque ha ejecutado.

Se puede ver los permisos / ACL específicamente a través de cualquiera \zo\dp

Si lees más aquí:

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

Si se desplaza hacia abajo (o busca la palabra psql), puede mirar la tabla que le muestra cómo interpretar las ACL que ve con \lo en una columna de ACL.

Por ejemplo:

=Tc/vagrant

significa que PUBLIC (el rol implícito que contiene todos los roles) tiene permisos para crear tablas temporales Ty conectarse c, porque la línea ACL =xxxxxdenota los permisos aplicados a PUBLIC, mientras que se rolname=xxxxaplica a ese rol específico.

Esta presentación de Dalibo también debería ayudar a aclarar esto: Gestión de derechos en PostgreSQL

Espero que ayude. =)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.