Un privilegi (o permís) és el dret a fer una operació concreta sobre un objecte de la base
de dades, com consultar una taula o crear-ne de noves. Els privilegis s'assignen als rols, de manera
que cada usuari pot fer exactament allò que necessita i res més. És el que es coneix com a
principi de mínim privilegi.
En PostgreSQL, el control d'accés es basa en tres idees:
Propietari: el rol que crea un objecte n'és el propietari i hi té tots els privilegis.
A més, és l'únic que el pot modificar (ALTER) o eliminar (DROP).
Privilegis sobre objectes: la resta de rols només poden accedir a un objecte si el propietari
(o un superusuari) els concedeix els privilegis corresponents.
Atributs de rol: les capacitats globals, com crear bases de dades o rols, no són privilegis
sinó atributs del rol (vegeu Usuaris i rols).
Els exemples d'aquests apunts continuen l'escenari dels apunts d'usuaris: la base de dades botiga,
amb les taules productes i clients, el grup vendes i els usuaris ana i marc.
Cada tipus d'objecte admet uns privilegis concrets. La taula següent recull els més habituals:
Privilegi
Objectes
Permet
SELECT
Taules, vistes, columnes, seqüències
Consultar les dades
INSERT
Taules, columnes
Inserir files
UPDATE
Taules, columnes, seqüències
Modificar files
DELETE
Taules
Eliminar files
TRUNCATE
Taules
Buidar la taula
REFERENCES
Taules, columnes
Crear claus foranes que hi fan referència
TRIGGER
Taules
Crear triggers sobre la taula
CONNECT
Bases de dades
Connectar-se a la base de dades
CREATE
Bases de dades, esquemes
Crear esquemes (en una base de dades) o objectes (en un esquema)
TEMPORARY
Bases de dades
Crear taules temporals
USAGE
Esquemes, seqüències
Accedir als objectes de l'esquema o utilitzar la seqüència
EXECUTE
Funcions, procediments
Executar la funció o el procediment
ALL PRIVILEGES
Qualsevol
Tots els privilegis aplicables a l'objecte
Per accedir a una taula no n'hi ha prou amb el privilegi sobre la taula: cal també CONNECT sobre la base de dades i USAGE sobre l'esquema.
Per defecte, tots els rols (PUBLIC) tenen CONNECT sobre les bases de dades i USAGE
sobre l'esquema public. Des de PostgreSQL 15, en canvi, PUBLIC ja no té CREATE sobre
l'esquema public, de manera que els usuaris no poden crear-hi taules si no se'ls concedeix.
<privilegis>: llista de privilegis separats per comes, o ALL PRIVILEGES. En les taules,
es poden limitar a unes columnes concretes: SELECT (nom, preu).
<tipus_objecte> <objecte>: objecte sobre el qual es concedeixen (TABLE productes,
SCHEMA public, DATABASE botiga…). Per a les taules, la paraula TABLE és opcional.
<rol>: rol que rep els privilegis. La paraula especial PUBLIC els concedeix a tots els rols.
[WITH GRANT OPTION]: (opcional) permet al rol concedir, al seu torn, els mateixos privilegis
a altres rols.
INSERT 0 1
nom | email
-----+-------
(0 rows)
ERROR: permission denied for table clients
S'observa que ana hereta els privilegis del grup: pot inserir productes i consultar
les columnes permeses de clients, però no la resta de columnes. A més, per inserir en una taula
amb una columna SERIAL, cal també el privilegi USAGE sobre la seqüència associada.
Quan un esquema té moltes taules, es poden concedir els privilegis sobre totes alhora
amb la clàusula ALL TABLES IN SCHEMA:
GRANTSELECTONALLTABLESINSCHEMApublicTOvendes;
Aquesta ordre només afecta les taules que ja existeixen. Perquè els privilegis s'apliquen també
a les taules que es creen en el futur, cal definir els privilegis per defecte amb
ALTER DEFAULT PRIVILEGES:
[GRANT OPTION FOR]: (opcional) retira només la possibilitat de concedir el privilegi a altres rols,
però no el privilegi.
<privilegis>, <tipus_objecte> <objecte> i <rol>: els mateixos valors que en
GRANT.
[CASCADE | RESTRICT]: (opcional) indica què passa si el rol havia concedit el privilegi a altres rols
amb WITH GRANT OPTION. Amb CASCADE també es revoca als altres rols; amb RESTRICT,
que és el valor per defecte, l'ordre falla.
Com s'ha vist en la introducció, el propietari d'un objecte hi té tots els privilegis i és l'únic
que el pot modificar o eliminar. Per això, és habitual que els objectes d'una aplicació pertanguen
a un rol sense LOGIN i que els usuaris hi accedisquen amb privilegis concedits.
La propietat d'un objecte es pot transferir amb la clàusula OWNER TO de l'ordre ALTER
corresponent: