Skip to content

ACLs

Privileges on database objects, grouped by the kind of object they are on. Written under grants: or revocations: on the role, user, or group they apply to, so a role file is the whole story of what that role can do. ALL stands for every privilege the object type has. Append WITH GRANT OPTION to a privilege to let the grantee grant it onward.

Properties

Property Type Required Description
columns map Privileges on individual columns, keyed by schema.table.column. Each value is an array of (SELECT | INSERT | UPDATE | REFERENCES | ALL).
databases map Privileges on databases, keyed by database name. Each value is an array of (CREATE | CONNECT | TEMP | TEMPORARY | ALL).
domains map Privileges on domains, keyed by schema.domain. Each value is an array of (USAGE | ALL).
foreign_data_wrappers map Privileges on foreign data wrappers, keyed by wrapper name. Each value is an array of (USAGE | ALL).
foreign_servers map Privileges on foreign servers, keyed by server name. Each value is an array of (USAGE | ALL).
functions map Privileges on functions and procedures, keyed by schema.function(argument types): the signature, since the name alone is ambiguous across overloads. Each value is an array of (EXECUTE | ALL).
groups array of (string | object) Memberships in other roles. Each entry is the role name on its own when the membership behaves the way GRANT <role> TO <member> grants it, or a mapping when it does not. admin: true writes WITH ADMIN OPTION. inherit and set write the per-membership WITH INHERIT / WITH SET options, which need PostgreSQL 16 or later; omit inherit to defer to the member role's own inherit option, which is what PostgreSQL does. The grantor (GRANTED BY) is not carried: it records who granted the membership in one cluster, not what the schema is. Entries must be unique.
languages map Privileges on procedural languages, keyed by language name. Each value is an array of (USAGE | ALL).
large_objects map Privileges on large objects, keyed by OID. Each value is an array of (SELECT | UPDATE | ALL).
roles array of (string | object) Memberships in other roles. Each entry is the role name on its own when the membership behaves the way GRANT <role> TO <member> grants it, or a mapping when it does not. admin: true writes WITH ADMIN OPTION. inherit and set write the per-membership WITH INHERIT / WITH SET options, which need PostgreSQL 16 or later; omit inherit to defer to the member role's own inherit option, which is what PostgreSQL does. The grantor (GRANTED BY) is not carried: it records who granted the membership in one cluster, not what the schema is. Entries must be unique.
schemata map Privileges on schemas, keyed by schema name. Each value is an array of (CREATE | USAGE | ALL).
sequences map Privileges on sequences, keyed by schema.sequence. Each value is an array of (SELECT | UPDATE | USAGE | ALL).
tables map Privileges on tables, keyed by schema.table. Privileges on a view may be written here or under views: PostgreSQL grants on a view with TABLE syntax, so both emit GRANT ... ON TABLE. Each value is an array of (SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN | ALL).
tablespaces map Privileges on tablespaces, keyed by tablespace name. Each value is an array of (CREATE | USAGE | ALL).
types map Privileges on types, keyed by schema.type. Each value is an array of (USAGE | ALL).
views map Privileges on views, keyed by schema.view. Emitted as GRANT ... ON TABLE, as PostgreSQL requires. Each value is an array of (SELECT | ALL).

No other properties are accepted.


Source: schemata/acls.yml · Resolved JSON Schema: acls.json