Añadir una política de acceso a nivel de fila con VPD (DBMS_RLS)
OracleSeguridadComando
-- 1) Policy function returning the predicate:
CREATE OR REPLACE FUNCTION customer_app.customer_vpd_fn (
p_schema IN VARCHAR2,
p_object IN VARCHAR2
) RETURN VARCHAR2
AS
BEGIN
-- The schema owner sees all rows (NULL = no restriction)
IF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'CUSTOMER_APP' THEN
RETURN NULL;
END IF;
-- Other users see only their own city
RETURN 'city = SYS_CONTEXT(''USERENV'', ''CLIENT_IDENTIFIER'')';
END;
/
-- 2) Attach the policy to the table:
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema => 'CUSTOMER_APP',
object_name => 'CUSTOMER',
policy_name => 'CUSTOMER_CITY_VPD',
function_schema => 'CUSTOMER_APP',
policy_function => 'CUSTOMER_VPD_FN',
statement_types => 'SELECT, UPDATE, DELETE',
update_check => TRUE,
policy_type => DBMS_RLS.CONTEXT_SENSITIVE);
END;
/
-- 3) Check:
SELECT object_owner, object_name, policy_name, function,
sel, upd, del, chk_option, enable, policy_type
FROM dba_policies WHERE object_owner = 'CUSTOMER_APP';
-- Test (as the application user): EXEC DBMS_SESSION.SET_IDENTIFIER('Ankara');
-- 4) Temporarily disable / drop:
EXEC DBMS_RLS.ENABLE_POLICY('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_CITY_VPD', FALSE);
EXEC DBMS_RLS.DROP_POLICY('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_CITY_VPD');Qué hace
Virtual Private Database añade automáticamente el predicado WHERE devuelto por la función de política a cada SQL sobre la tabla, de modo que los usuarios de la misma tabla solo ven/modifican las filas a las que tienen derecho. update_check=>TRUE impide que un usuario actualice una fila a un valor que no podría ver.
Cuándo usarlo
En aplicaciones multiinquilino, para el aislamiento de datos por región/sucursal y para añadir seguridad de filas sin tocar el código de la aplicación.
Precaución
Incluido en Enterprise Edition, sin licencia adicional. El cliente puede definir libremente CLIENT_IDENTIFIER; en producción use un application context definido por un paquete de confianza (CREATE CONTEXT ... USING). SYS y los usuarios con EXEMPT ACCESS POLICY omiten la política; las exportaciones de Data Pump sin ese privilegio exportan datos parciales sin avisar. Un error en la función bloquea todo el acceso con ORA-28112. Un policy_type erróneo (p. ej., STATIC) guarda en cache el predicado y devuelve resultados incorrectos.
Relacionado
- Crear, abrir, definir la master key y hacer backup de un keystore TDE (19c+)
- Cifrar tablespaces con TDE (nuevos y existentes, online/offline)
- Crear una política de Unified Auditing, habilitarla de forma condicional, revisar los registros y eliminarla
- Crear un profile de política de contraseñas y asignarlo a usuarios
- Encontrar privilegios no usados con privilege analysis