Contexto de aplicación.
El contexto de aplicación es el namespace, quiere decir que es un contenedor en memoria (como una caja) que contiene atributos de solo lectura.
- Cada sesión tiene su propio namespace, por lo que cada namespace es independiente de los otros.
- Los atributos del namespace son almacenados por medio de un paquete PL/SQL.
- Un paquete es una estructura que agrupa lógicamente otros objetos de PL/SQL relacionados entre sí, como procesos, funciones, variables, etc. en la base de datos.
Tipos de contextos.
Existen dos tipos de contextos.
- Locales: Son utilizados únicamente para los inicios de sesión, en el cual se asigna un valor al paquete PL/SQL el cual es seteado al contexto de aplicación y leído por el PL/SQL. Estos namespace son guardados en el PGA.
- Globales: Son utilizados para todos, en el cual se pueden setear los atributos desde una sesión para ponerle a otra sesión. Estos namespace son guardados en el SGA.
Pasos para Crear Contextos de Aplicación.
- Crear o reemplazar el contexto.
- Crear el namespace para el contexto.
- Asociar el namespace con el paquete creado externamente que establece el contexto. Por defecto se crean en el esquema SYS.
- Se puede ejecutar la sentencia o utilizar la cláusula initialized o accessed.
Initialized permite especificar una entidad distinta de base de datos que puede inicializar el namespace del contexto. Puede ser:
- Externally, indica que el namespace se puede inicializar utilizando una interfaz OCI al establecer sesión.
- Globally, indica que el namespace se puede inicializar por el directorio LDAP cuando un usuario global se conecta a la base de datos.
Accessed Globally, indica que cualquier contexto de aplicación establecido en el namespace es accesible a través de toda la instancia.
Control de Acceso Granular (FGAC).
Las aplicaciones requieren el control del acceso a nivel de registro de datos, quiere decir que los usuarios deben ser capaces de ver sólo las filas que están autorizados.
Con el FGAC se pueden limitar el acceso a filas y columnas, por medio de una función que retorna un predicado para ser añadido a la sentencia como una condición.
Entre las ventajas del FGAC es la seguridad que brinda para que las personas puedan ver sólo las filas autorizadas. Su simplicidad, ya que se hace una sola vez y se ejecuta muchas veces. Flexibilidad y alto desempeño al ser dinámico.
Pasos para utilizar el FGAC
- Se realiza la consulta normal "SELECT * FROM empleados;"
- El servidor de la base de datos recibe la consulta, en ese momento llama a la función respectiva para que en función de algo le devuelva el predicado. " departamento_emp_id =3; "
- Se agrega el predicado a la consulta."SELECT * FROM empleados WHERE departamento_emp_id =3; "
- Se ejecuta la sentencia.
Bases de Datos virtuales (VPD)
Es una función de Oracle que permite crear políticas de seguridad para controlar el acceso a la base de datos a nivel de filas y columnas. Cada vez que un usuario accede a los datos de una tabla protegida, Oracle modifica la instruccion SQL del usuario, le agrega una clausula "WHERE" conocida con predicado que es devuelta de una función de la aplicación de la política de seguridad. Puede aplicar politicas a SELECT,INSERT,UPDATE,INDEX y DELETE.
Por ejemplo, un usuario realiza la siguiente consulta:
SELECT * FROM OE.ORDERS;
Se pide que se filtre al usuario en función de la información de la sesión de ese usuario, puede crear la clausula WHERE en contexto a la aplicación.
SELECT * FROM OE.ORDERS
WHERE SALES_REP_ID = SYS_CONTEXT('USERENV','SESSION_USER');
Pasos para la implementación de VPD.
1) Crear un paquete PL/SQL para ajustar al contexto.
CREATE OR REPLACE PACKAGE orders_ctx_pkg IS
PROCEDURE set_custnum;
END;
/
CREATE OR REPLACE PACKAGE BODY orders_ctx_pkg IS
PROCEDURE set_custnum
AS
custnum NUMBER;
WHERE cust_email = SYS_CONTEXT( ' USERENV ' , ' SESSION_USER ');
SELECT cust_no INTO custnum FROM scott.customers
END;
/
2) Crear un contexto de la aplicación.
CREATE OR REPLACE CONTEXT orders_ctx USING orders_cxt_pkg;
3) Crear un inicio de sesión de activación para ejecutar e contexto de aplicación PL/SQL
CREATE TRIGGER set_custno_ctx_trig AFTER LOGON ON DATABASE
BEGIN
sysadmin_vpd.orders_ctx_pkg.set_custnum;
END;
/
4) Crear la función PL/SQL que genera el predicado.
CREATE OR REPPLACE FUNCTION get_user_orders(
schema_p IN VARCHAR2,
table_p IN VARCHAR2)
RETURN VARCHAR2
AS
orders_pred VARCHAR2 (400);
BEGIN
orders_pred := ' cust_no = SYS_CONTEXT(' ' orders_ctx' ', ' 'cust_no' ') ';
RETURN orders_pred;
END;
/
5) Crear la política para asociar a la función de la tabla.
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'scott',
object_name => 'orders_tab',
policy_name => 'orders_policy',
function_schema => 'sysadmin_vpd',
policy_function => 'get_user_orders',
statement_types => 'select');
END;
/
VIDEO TUTORIAL.
Contextos.
VPD.
Bibliografía.