Simulando Virtual Private Databases

Oracle tiene una característica de seguridad llamada Virtual Private Databases (VPDs) que viene incluida como parte del paquete Oracle Avanced Security. Las Virtual Private Databases permiten a los administradores de la base de datos crear procedimientos almacenados que de forma automática agregan una cláusula where a una consulta.

Por poner un ejemplo, si un usuario inicia sesión en una Virtual Private Databases con cualquier herramienta cliente que le permita el acceso y ejecuta la consulta SELECT * FROM DIVISA_CAMBIO podrá obtener resultados completamente distintos a los de otro usuario que haya accedido. Es decir, podríamos limitar el acceso a la tabla para que cada usuario únicamente pueda ver los cambios de divisa de su continente o zona de países.


En el resto de bases de datos, aunque esta funcionalidad no esta implementada, podremos simularla en base a vistas sobre la tabla a consultar y el usuario de conexión.

Por ejemplo:

  • Empezamos creando la tabla de permisos. En esta tabla indicaremos los usuarios de base de datos y el filtro o filtros que serán aplicados en la vista final.
         CREATE TABLE USERS_FILTERS
           (USER          VARCHAR(50),
            USER_DESC     VARCHAR(255),
            FILTER_1      VARCHAR(5),
            FILTER_2      VARCHAR(5));

  • En esta tabla insertamos dos usuarios y aplicamos los filtros a los que tienen permiso sobre la vista final. Estos usuarios deberán estar dados de alta en la base de datos con los permisos oportunos:
         INSERT INTO USER_FILTERS (USER, USER_DESC, FILTER_1, FILTER_2) 
                 VALUES ('usurioroot', 'usuario root', '00001', '20000');
         INSERT INTO USER_FILTERS (USER, USER_DESC, FILTER_1, FILTER_2) 
                 VALUES ('usuriopub', 'usuario pub', '00002', '30000');

  • Supongamos ahora que en nuestra tabla de origen llamada DATOS_ORIGEN tenemos la siguiente información:

id_key   id_pais    desc_pais    id_empresa   des_empresa  ingresos
---------------------------------------------------------------------
1         00001     España       20000        Sua.SL         24.500
2         00001     España       30000        Fax.SA         44.000
3         00002     Portugal     30000        Trans.SA       14.000


  • Creamos ahora la vista a la cual accederán los usuarios:
CREATE VIEW VISTA_DATOS_ORIGEN (ID_PAIS, DESC_PAIS, INGRESOS) AS
SELECT ID_PAIS, DESC_PAIS, SUM(INGRESOS)
 FROM DATOS_ORIGEN O
 INNER JOIN USER_FILTERS  F ON
              F.FILTER_01=ID_PAIS   AND
              F.FILTER_02=ID_EMPRESA AND
              F.USER = USER       <--- USUARIO DE BBDD
 GROUP BY ID_PAIS, DESC_PAIS;


Ahora, si hacemos una prueba, entrenado con un usuario y otro (usurioroot o usuriopub) y ejecutando la consulta SELECT * FROM VISTA_DATOS_ORIGEN nos devolverá unos resultados u otros.

La base de las VPDs es esta, ahora experimentad vosotros y buscadle utilidad....


Comentarios

Anónimo ha dicho que…
Muy buena aportación

Entradas populares de este blog

Uso de la función RANKX (DAX)