Pessoal, para uma determinada atividade que precisei executar, eu tive a necessidade de conectar como um determinado usuário da Aplicação no banco , usuário esse que desconhecia a senha, E um simples ALTER SESSION SET CURRENT_SCHEMA não funcionaria (princiopalmente por ter que executar stored PL/SQLs) : não é nada tão incomum, às vezes acontece... Nesses casos o procedimento comum é conectar como DBA no banco, consultar a senha do usuário desejado criptografada na DBA_USERS (ou na USER$ se for banco 11g), pedir um ALTER USER nomedousuario IDENTIFIED BY senhatemporariaqualquer; conectar no usuário desejado e imediatamente voltar a senha ao que estava antes com um ALTER USER nomedousuario IDENTIFIED BY VALUES ('stringdasenhacriptografada').
Essa técnica funciona desde sempre mas tem a desvantagem de, por uns segundos que seja, o usuário desejado ficar com a senha alterada, o que pode facilmente causar interrupção na aplicação, além de ser um tanto complexo de se fazer . Hoje porém eu encontrei a referência em http://www.dbsnaps.com/oracle/connect-as-an-oracle-user-without-knowing-the-password/ que na versão 10g, que é o que temos aqui em produção (o recurso existe no sqlplus de 10gr2 em diante, iirc) o sqlplus já aceita conexão por proxy, aí botei a mão na consciência e me perguntei porque não usar o recurso, né ? Dãã pra mim... Então fiz assim : a. conectei no banco como SYSDBA b. temporariamente dei para um outro usuário que nós tinhamos a senha a permissão de conectar como se fosse o usuário desejado : SYS:AS SYSDBA:SQL>alter user USER_APLIC grant connect through USER_COM_SENHA_CONHECIDA; User altered. c. conectei num outra sqlplus como o usuário que temos a senha mas fazendo proxy no usuário realmente desejado : USER_COM_SENHA_CONHECIDA::SQL>conn USER_COM_SENHA_CONHECIDA[USER_APLIC]/senhaconhecida Connected. USER_APLIC::SQL>show user USER is "USER_APLIC" d. no sqlplus original removi do usuário que conhecemos a senha a permissão de conectar via proxy : SYS:AS SYSDBA:SQL>alter user USER_APLIC revoke connect through USER_COM_SENHA_CONHECIDA; User altered. e é isso... Achei mais simples de fazer e absolutamente não perturba a Aplicação nem o pool de conexões nem nada, fikadika ... Abraços, José Laurindo Chiappa OBS : a. o link não fala, mas por segurança o RDBMS exige que o usuário com a senha já conhecida e que vai receber o GRANT ** não seja ** um usuário privilegiado, senão ele rejeita a operação com ORA-28150 : :@:SQL>conn system[userdestino]/senhadosystem ERROR: ORA-28150: proxy not authorized to connect as client b. DE FORMA ALGUMA isso que eu disse é um hack, um 'segredo interno' : essa técnica está Plenamente Documentada nos manuais Oracle, então não temos por que não divulgar... c. Falando sobre segurança, ela nos lembra o QUANTO é ultra-mega-poderoso o privilégio de ALTER USER, e o perigo que é dar esse privilégio para qualquer um que não é DBA... É um pouco parecido com o privilégio de ALTER SESSION, que muita gente pede e recebe sem pensar duas vezes mas que dá pra fazer muuuito estrago, principalmente ativando eventos na sessão....