|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PrivilegisJoan Puigcerver Ibáñez Introducció¶Un privilegi és el dret a executar un tipus concret de sentència SQL o a accedir a un objecte d'un altre usuari. Els privilegis s'assignen a usuaris i a 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 Oracle DB, es distingeixen dos tipus de privilegis:
A més, l'usuari propietari d'un esquema té tots els privilegis sobre els seus propis objectes, sense necessitat que ningú els hi concedisca. Els exemples d'aquests apunts continuen l'escenari dels apunts d'usuaris: la PDB Privilegis de sistema¶Tipus de privilegis de sistema¶Oracle DB té més de 200 privilegis de sistema. Els més habituals són els següents:
Els privilegis amb Assignació de privilegis de sistema (
|
| Privilegi | Objectes | Permet |
|---|---|---|
SELECT |
Taules, vistes, seqüències | Consultar les dades |
INSERT |
Taules, vistes | Inserir files |
UPDATE |
Taules, vistes | Modificar files (es pot limitar a columnes) |
DELETE |
Taules, vistes | Eliminar files |
REFERENCES |
Taules | Crear claus foranes que hi fan referència |
ALTER |
Taules, seqüències | Modificar l'estructura de l'objecte |
INDEX |
Taules | Crear índexs sobre la taula |
EXECUTE |
Procediments, funcions, paquets | Executar el subprograma |
ALL |
Qualsevol | Tots els privilegis aplicables a l'objecte |
Assignació de privilegis d'objecte (GRANT ... ON)¶
Els privilegis d'objecte es concedeixen amb l'ordre GRANT, indicant l'objecte amb la clàusula ON:
<privilegis>: llista de privilegis separats per comes, oALL. El privilegiUPDATEes pot limitar a unes columnes concretes:UPDATE (preu, stock).<esquema>.<objecte>: objecte sobre el qual es concedeixen.<usuari_o_rol>: usuaris, rols oPUBLIC.[WITH GRANT OPTION]: (opcional) permet a qui el rep concedir el privilegi a altres usuaris. No es pot utilitzar quan es concedeix a un rol.
Exemple: Concedir privilegis sobre les taules de botiga
Es permet al rol rol_vendes consultar i inserir productes, i modificar-ne només el preu
i l'estoc. A més, marc pot consultar els clients:
GRANT SELECT, INSERT ON botiga.productes TO rol_vendes;
GRANT UPDATE (preu, stock) ON botiga.productes TO rol_vendes;
GRANT SELECT ON botiga.clients TO marc;
Es comprova connectat com marc, que té el rol rol_vendes:
UPDATE botiga.productes SET stock = 5 WHERE id = 1;
UPDATE botiga.productes SET nom = 'Ratolí' WHERE id = 1;
S'observa que marc pot modificar l'estoc, però no el nom, ja que el privilegi UPDATE
només s'ha concedit sobre les columnes preu i stock.
Per no haver d'escriure l'esquema davant de cada taula, es poden crear sinònims: CREATE SYNONYM productes FOR botiga.productes;.
Revocació de privilegis d'objecte (REVOKE ... ON)¶
Els privilegis d'objecte es retiren amb l'ordre REVOKE:
[CASCADE CONSTRAINTS]: (opcional) en revocarREFERENCESoALL, elimina també les claus foranes que l'usuari havia creat gràcies a aquest privilegi.
A diferència dels privilegis de sistema, la revocació d'un privilegi d'objecte es propaga en cascada: si l'usuari l'havia concedit a altres amb WITH GRANT OPTION, també el perden.
Els privilegis revocats a un rol no es poden retirar a un sol usuari: REVOKE ... FROM marc no té efecte si marc el rep a través de rol_vendes.
Assignació de rols¶
Els rols s'assignen i es retiren amb les mateixes ordres que els privilegis de sistema. D'aquesta manera, un usuari rep de cop tots els privilegis del rol, i els perd tots quan se li retira:
[WITH ADMIN OPTION]: (opcional) permet a l'usuari assignar el rol a altres usuaris.
Un rol també es pot assignar a un altre rol, de manera que es creen jerarquies de privilegis:
CREATE ROLE rol_encarregat;
GRANT rol_vendes TO rol_encarregat;
GRANT DELETE ON botiga.productes TO rol_encarregat;
S'observa que rol_encarregat té tots els privilegis de rol_vendes i, a més, pot eliminar productes.
Els privilegis rebuts a través d'un rol no estan disponibles dins dels procediments emmagatzemats1.
Consulta dels privilegis¶
El diccionari de dades inclou diverses vistes per consultar els privilegis concedits.
Cada vista té la seua versió DBA_ (tots els usuaris) i USER_ (usuari actual):
| Vista | Contingut |
|---|---|
DBA_SYS_PRIVS |
Privilegis de sistema concedits a usuaris i rols |
DBA_TAB_PRIVS |
Privilegis sobre objectes |
DBA_COL_PRIVS |
Privilegis sobre columnes |
DBA_ROLE_PRIVS |
Rols concedits a usuaris i rols |
ROLE_SYS_PRIVS |
Privilegis de sistema de cada rol |
ROLE_TAB_PRIVS |
Privilegis d'objecte de cada rol |
SESSION_PRIVS |
Privilegis actius en la sessió actual |
Exemple: Consultar els privilegis d'objecte
Es consulten els privilegis concedits sobre la taula productes:
SELECT grantee, privilege, grantable
FROM dba_tab_privs
WHERE owner = 'BOTIGA' AND table_name = 'PRODUCTES';
SELECT grantee, column_name, privilege
FROM dba_col_privs
WHERE owner = 'BOTIGA' AND table_name = 'PRODUCTES';
S'observa que els privilegis sobre columnes no apareixen a DBA_TAB_PRIVS,
sinó a DBA_COL_PRIVS.
-
Els procediments i les funcions s'executen per defecte amb els privilegis del seu propietari (definer's rights), i Oracle només té en compte els privilegis concedits directament a l'usuari, no els dels rols. ↩