El RDBMS de Oracle tiene dentro de sus métodos de autenticación una manera llamada usuario proxy, este usuario lo que te permite hacer es poder conectarte con las credenciales que tu tienes (usuario y contraseña que tu ya conoces) y ejercer acciones en un usuario en el que tu no tienes contraseña.

Y te vas a preguntar, pues para que me sirve esto si ya soy un super usuario, bueno una de las primeras cosas que se me viene a la mente es crear un database link privado, ya que la unica manera de crearlo es si estas conectado como el usuario que requiere el database link 🙂

Aquí te voy a dar un ejemplo de como crear un usuario proxy y como usarlo, ya tu te divertirás con las cosas que puedes hacer con este método de autenticación.

Lo primero que voy a hacer es crear un llamado usuario_princi y un usuario llamado usuario_proxy, después de crear el usuario proxy, vas a ver que altero al usuario para darle un grant connect through, esto es lo que nos va a permitir conectarnos como un usuario proxy

TESTDB> create user usuario_princi identified by 1234;

User created.

TESTDB> create user usuario_proxy identified by proxy1234;

User created.

TESTDB> grant create session, create table to usuario_princi;

Grant succeeded.

TESTDB> alter user usuario_princi grant connect through usuario_proxy;

User altered.

Una vez que creamos al usuario proxy, nos conectamos de la siguiente manera, vas a ver que aunque estoy usando el usuario y contraseña de usuario_proxy, mi esquema de contexto es usuario_princi

TESTDB> connect usuario_proxy[usuario_princi]/proxy1234
Connected.
USER: USUARIO_PRINCI
SESSION ID: 45
CURRENT_SCHEMA: USUARIO_PRINCI
INSTANCE NAME: TESTDB
DATABASE ROLE: PRIMARY
OS USER: oracle
CLIENT IP ADDRESS:
SERVER HOSTNAME: servidor1
CLIENT HOSTNAME: servidor1.oracleenespanol.blogspot.com

PL/SQL procedure successfully completed.

TESTDB> select sys_context('userenv','current_user') from dual;

SYS_CONTEXT('USERENV','CURRENT_USER')
--------------------------------------------------------------------------------
USUARIO_PRINCI

TESTDB> select sys_context('userenv','proxy_user') from dual;

SYS_CONTEXT('USERENV','PROXY_USER')
--------------------------------------------------------------------------------
USUARIO_PROXY

Ahora como ejemplo, vamos a crear una tabla y vas a ver que esta tabla se crea en el usuario_princi, no en el usuario_proxy que fue con el que nos conectamos

TESTDB> create table prueba (id number);

Table created.


TESTDB> select owner from all_tables where table_name='PRUEBA';

OWNER
---------------
USUARIO_PRINCI

Ya nada mas para verificar , audite a la sesión y las acciones de crear una tabla para los usuarios y el resultado es este

TESTDB> AUDIT CREATE TABLE BY usuario_proxy ON BEHALF OF usuario_princi;

Audit succeeded.

TESTDB> AUDIT CREATE TABLE BY usuario_princi BY ACCESS;

Audit succeeded.

TESTDB> SELECT
2 tr2.username PROXY,
3 tr1.username USERNAME,
4 tr1.extended_timestamp,
5 tr1.owner,
6 tr1.obj_name,
7 tr1.action_name,
8 tr1.returncode ,
9 tr1.SESSIONID,
10 tr1.PROXY_SESSIONID
11 FROM dba_audit_trail tr1,
12 dba_audit_trail tr2
13 WHERE tr1.obj_name not in ( 'DUAL','SQLPLUS_PRODUCT_PROFILE','PRODUCT_PRIVS')
14 AND tr1.proxy_sessionid=tr2.sessionid
15 AND tr2.action_name='PROXY AUTHENTICATION ONLY' and tr2.username='USUARIO_PROXY' and tr1.owner='USUARIO_PRINCI'
16 ORDER BY tr1.timestamp;

PROXY USERNAME EXTENDED_TIMESTAMP OWNER OBJ_NAME ACTION_NAME RETURNCODE SESSIONID PROXY_SESSIONID
--------------- --------------- ------------------------- --------------- ---------- --------------- ---------- ---------- ---------------
USUARIO_PROXY USUARIO_PRINCI 14-AUG-12 04.31.30.650906 USUARIO_PRINCI PRUEBA CREATE TABLE 0 14900441 14900440
AM -07:00

Como te puedes dar cuenta este método te puede ayudar para crear un database link en el usuario o de igual manera le puede ayudar a tu desarrollador para que se conecte a un usuario y no tener que crear sinónimos.