Otra nueva característica que nos trae Oracle Database 23c es la posibilidad de otorgar permisos en forma sencilla sobre todos los objetos de un esquema, sin necesidad de identificarlos individualmente ni de agregar nuevos permisos al agregar nuevos objetos.
Escenario
Tenemos una aplicación con 600 tablas distribuidas en los esquemas Ventas y RRHH. Para poder analizar las ventas, desarrollamos un conjunto de reportes que se acceden con un nuevo usuario VentasR que debe tener acceso a las tablas del esquema Ventas pero solo para lectura.
Hasta Oracle 23c, para poder hacer esto teníamos dos opciones:
- Otorgar el privilegio READ o SELECT al usuario VentasR de cada una de las tablas del esquema Ventas en forma individual. Si en el esquema Ventas se agregan nuevas tablas, es necesario que otorgar el privilegio de READ o SELECT a cada nueva tabla.
- Otorgar el privilegio de sistema SELECT ANY TABLE al usuario VentasR, con lo cual no es necesario darle privilegios individuales al agregar nuevas tablas a Ventas, pero el usuario podrá ver también información de las tablas del esquema RRHH.
Como vemos, una solución es la correcta desde el punto de vista de requerimiento (otorgar permisos individuales) aunque es costosa de implementar y mantener, y la otra es sencilla desde el punto de vista de su otorgamiento y no requiere más interacción si se agregan tablas, pero introduce un riesgo de seguridad al permitir el acceso a TODAS las tablas de la base de datos en vez de sólo las del esquema Ventas.
Otorgar Privilegios de Esquema
Oracle Database 23c incluye un nuevo tipo de privilegio adicional al de sistema o de objeto, que es el privilegio de esquema. Con el, podemos otorgar un privilegio a todos los objetos existentes en un esquema, sin necesidad de identificar los mismos en forma individual. Para nuestro caso, la sintaxis sería la siguiente:
GRANT SELECT ANY TABLE ON SCHEMA Ventas TO VentasR;
CREATE USER Ventas IDENTIFIED BY Ventas23c QUOTA UNLIMITED ON users; GRANT db_developer_role TO Ventas; CREATE TABLE Ventas.TablaV1 (ID NUMBER(10), Descripcion VARCHAR(100)); CREATE TABLE Ventas.TablaV2 (ID NUMBER(10), Descripcion VARCHAR(100)); INSERT INTO Ventas.TablaV1 VALUES (1, 'TablaV1 - 1'); INSERT INTO Ventas.TablaV1 VALUES (2, 'TablaV1 - 2'); INSERT INTO Ventas.TablaV2 VALUES (1, 'TablaV2 - 1'); INSERT INTO Ventas.TablaV2 VALUES (2, 'TablaV2 - 2'); -- CREATE USER RRHH IDENTIFIED BY RRHH23c QUOTA UNLIMITED ON users; GRANT db_developer_role TO RRHH; CREATE TABLE RRHH.TablaV1 (ID NUMBER(10), Descripcion VARCHAR(100)); CREATE TABLE RRHH.TablaV2 (ID NUMBER(10), Descripcion VARCHAR(100)); INSERT INTO RRHH.TablaV1 VALUES (1, 'TablaV1 - 1'); INSERT INTO RRHH.TablaV1 VALUES (2, 'TablaV1 - 2'); INSERT INTO RRHH.TablaV2 VALUES (1, 'TablaV2 - 1'); INSERT INTO RRHH.TablaV2 VALUES (2, 'TablaV2 - 2'); -- CREATE USER VentasR IDENTIFIED BY VentasR23c QUOTA UNLIMITED ON users; GRANT CONNECT TO VentasR;
SELECT * FROM Ventas.TablaV1;SELECT * FROM Ventas.TablaV2; SELECT * FROM RRHH.TablaV1;
SELECT * FROM Ventas.TablaV1;SELECT * FROM Ventas.TablaV2; SELECT * FROM RRHH.TablaV1;
REVOKE SELECT ANY TABLE FROM VentasR; GRANT SELECT ANY TABLE ON SCHEMA Ventas TO VentasR;
Revoke correcto. Grant correcto.
Consultando Privilegios de Esquema
- DBA_SCHEMA_PRIVS
- ROLE_SCHEMA_PRIVS
- USER_SCHEMA_PRIVS
- SESSION_SCHEMA_PRIVS
- V$ENABLEDSCHEMAPRIVS
Conclusión
Con esta nueva funcionalidad se hace mucho más fácil gestionar los permisos otorgados a nivel de objetos de usuario. Ya no es necesario actualizar los permisos otorgados de un usuario A a un usuario B ante cualquier objeto que se agregue al usuario A.
Si bien demostramos el mismo con el permiso de SELECT, puede usarse con cualquier privilegio como se detalla en la documentación.
Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:
- Oracle Database 23c Free - Developer Edition.
- Instalando Oracle Database 23c (Free Developer Edition) en Oracle Cloud.
Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.
No hay comentarios.:
Publicar un comentario