Los usuarios proxy en Oracle representan una funcionalidad poderosa que permite a un usuario conectarse a la base de datos a través de otro usuario, manteniendo la seguridad y trazabilidad. En este artículo, exploraremos cómo implementar usuarios proxy en Oracle OCI Autonomous Database y veremos casos de uso prácticos.
¿Qué son los Usuarios Proxy?
Un usuario proxy permite a un desarrollador conectarse a la base de datos a través de otro usuario (el schema propietario), manteniendo la trazabilidad individual. En nuestro caso:
- Juan se conecta como hr_juan pero trabaja en el schema hr_app
- María se conecta como hr_maria pero trabaja en el schema hr_app
- Carlos se conecta como hr_carlos pero trabaja en el schema hr_app
Beneficio: Todos trabajan en los mismos objetos.
Desarrollador → Usuario Proxy → Schema de Trabajo
(Juan) → hr_juan → hr_app
Implementación en OCI Autonomous Database
- Crear el Schema de Trabajo, ejemplo HR_APP
— Conectar como ADMIN
create user hr_app identified by "MiPassword123!";
grant create session, create table, unlimited tablespace to hr_app;
-- De acuerdo a la necesidad
grant create view to hr_app;
grant create sequence to hr_app;
grant create procedure to hr_app;
grant create trigger to hr_app;
grant create synonym to hr_app;
Crear Usuarios Proxy para Desarrolladores
— Crear usuarios para cada desarrollador
create user hr_juan identified by "JuanPass123!";
create user hr_maria identified by "MariaPass123!";
create user hr_carlos identified by "CarlosPass123!";
— Otorgar privilegios de conexión proxy
grant create session to hr_juan, hr_maria, hr_carlos;
— Configurar autenticación proxy
alter user hr_app grant connect through hr_juan;
alter user hr_app grant connect through hr_maria;
alter user hr_app grant connect through hr_carlos;
Conexión con SQL Developer y SQL*Plus
Para conectarse usando usuarios proxy, debes usar el formato: [proxy_user][target_user]
Conexión con SQL Developer

Cada desarrollador se conecta con su propio usuario usando proxy y en un mismo schema de objectos.
sqlplus hr_juan[hr_app]/JuanPass123@your_autonomous_db
sqlplus hr_maria[hr_app]/MariaPass123@your_autonomous_db
sqlplus hr_carlos[hr_app]/CarlosPass123@your_autonomous_db
Juan: Inserta nuevos empleados con su usuario juan_dev, manteniendo trazabilidad de quién creó cada registro.
María: Ve los datos que insertó Juan y los actualiza con su usuario maria_dev, Oracle registra sus modificaciones específicas.
Carlos: Consulta todo el historial con su usuario carlos_dev, accediendo a los cambios de todo el equipo.
Bonus
Consulta de proxys
Para saber que proxys actualmente estan configurados aun schema podriamos ejecutar:
select *
from dba_proxies
where client = 'HR_APP';
Auditoria
Muy aparte del beneficio que cada usuario tenga sus credenciales de conexion de manera independiente. Otro de los importes beneficios es la auditoria, ya que podriamos activar politicas y saber quien hizo cambios en la regristros.
Si usamos LOGGER lo mejor seria modificar el procedimiento ins_logger_logs y usar:
select sys_context('USERENV','PROXY_USER') as proxy_user
from dual;

Eso nos permitera capturar el real usuario conectado asi estemos en SQLcl O SQL Developer.
Como ven las llamdas APEX se mantienen con la configuracion correcta, y si ven un record con HR_APP es cuando no active el proxy, capturaba al usuario global.

La otra opcion seria habilitar DBMS_FGA.ADD_POLICY
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => 'HR_APP',
object_name => 'EMPLOYEES',
policy_name => 'FGA_EMPLOYEES_PROXY',
audit_condition => 'SYS_CONTEXT(''USERENV'',''PROXY_USER'') IS NOT NULL',
statement_types => 'INSERT,UPDATE,DELETE',
audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED -- incluye SQL y binds
);
END;
/
SELECT event_timestamp,
dbusername,
proxy_sessionid,
action_name,
object_schema,
object_name
FROM unified_audit_trail
WHERE object_name = 'HR_JUAN'
ORDER BY event_timestamp DESC;