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.