patternsqlMinor
When are privileges listed in \l and when not?
Viewed 0 times
areprivilegeslistedwhenandnot
Problem
When are access privileges listed by \l, and when are they not? The access privileges listed by \l can change after a grant and revoke:
Why is that? What state changed? I believe
$ 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/vagrantWhy is that? What state changed? I believe
Solution
The backslash commands in psql are shortcuts for a query or queries that look through the system catalogs. The
You can make
If the permissions on a database or other object are the defaults that PostgreSQL creates them with, the
You can see the permissions/ACLs specifically via either
If you read further here:
http://www.postgresql.org/docs/9.4/static/sql-grant.html
If you scroll down, (or search for the word
For example:
means that PUBLIC (the implicit role that contains all roles) has permissions to create temporary tables
This presentation from Dalibo should also help clarify this further: Managing Rights in PostgreSQL
Hope that helps. =)
\l command looks at information in pg_catalog.pg_database, specifically, this query: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;You can make
psql show what it is using for the backslash commands by passing the -E flag to it when you invoke it on the command line.If the permissions on a database or other object are the defaults that PostgreSQL creates them with, the
*acl column will be NULL. If you change the defaults, as you have, the ACL column will be populated with information related to the GRANT and/or REVOKE statements you have ran.You can see the permissions/ACLs specifically via either
\z or \dpIf you read further here:
http://www.postgresql.org/docs/9.4/static/sql-grant.html
If you scroll down, (or search for the word
psql), you can look at the table that shows you how to interpret the ACLs that you see with \l or in an ACL column.For example:
=Tc/vagrantmeans that PUBLIC (the implicit role that contains all roles) has permissions to create temporary tables
T and connect c, because the ACL line =xxxxx denotes permissions applied to PUBLIC, while rolname=xxxx applies to that specific role.This presentation from Dalibo should also help clarify this further: Managing Rights in PostgreSQL
Hope that helps. =)
Code Snippets
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;Context
StackExchange Database Administrators Q#110848, answer score: 6
Revisions (0)
No revisions yet.