Ajuda Select

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Resantos
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Ter, 07 Mai 2013 2:30 pm

Bom dia Pessoal,

Sou nova na area de banco de dados, estou estagiando e peguei uma solicitaçao de um cliente, porém não tem ninguém aqui agora para me ajudar.

Tenho que fazer o seguinte:
criar o usuário 456 no banco de dados xyz com o mesmo perfil do usuário 123.

Criar o usuario com o mesmo perfil eu sei, mas tenho que pegar os privilegios que esse outro usuario tem em outras tabelas.
Pra pegar o privilegio das tabelas eu usei este select:
select ('grant ' ||PRIVILEGE|| ' on '||OWNER||'.'||TABLE_NAME||' to '||GRANTEE||';') from dba_tab_privs where owner not in('123') AND GRANTEE='123';

Tenho que coletar também as views que este usuario tem acesso
A minha duvida é como vou coletar essas informações referente as views.

Obrigada

Renata
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Renata,

Bem vinda ao forum GLUFKE.

Então, talvez você possa usar a DBA_TAB_PRIVS para identificar as permissões atribuidas a este usuário.

Tente este comando:

Selecionar tudo

SELECT 'GRANT '||PRIVILEGE||' ON '||OWNER||'.'||TABLE_NAME||' TO '||GRANTEE||';' FROM DBA_TAB_PRIVS WHERE GRANTEE = '123'
Lembre-se: para atribuir o GRANT corretamente, você precisa estar conectado como o "OWNER" do objeto. Por exemplo, se o comando gerado informar "GRANT SELECT ON SYS.V$SESSION ..", você tem que executar este comando conectado como o usuário "SYS". E assim por diante.

Eu recomendaria duas coisas:

A) Leia um pouco sobre "ROLES". As "roles" corresponde a papeis que podem agrupar um conjunto completo de permissões. Por exemplo, a o invés de :

Selecionar tudo

GRANT SELECT, INSERT , DELETE on TAB_A TO USUARIO_1;
GRANT SELECT, INSERT , DELETE on TAB_B TO USUARIO_1;
GRANT SELECT, INSERT , DELETE on TAB_C TO USUARIO_1;
--
GRANT SELECT, INSERT , DELETE on TAB_A TO USUARIO_2;
GRANT SELECT, INSERT , DELETE on TAB_Z TO USUARIO_4;
Você pode atribuir estas permissões para uma ROLE e depois atribuir para um ou mais usuários;

Selecionar tudo

GRANT SELECT, INSERT , DELETE on TAB_A TO ROLE_A;
GRANT SELECT, INSERT , DELETE on TAB_B TO ROLE_A;
GRANT SELECT, INSERT , DELETE on TAB_C TO ROLE_A;
--
GRANT ROLE_A TO USUARIO_1;
GRANT ROLE_A TO USUARIO_2;
Perceba que com as roles, fica muito mais fácil você atribuir ou remover permissões de usuários. É melhor do que ficar levantando as permissões de um usuário para replicar em outro.

B) Pesquise um pouco mais sobre scripts de DBA na internet ("o pulo do gato").

Parece a princípio um conselho um pouco vago, mas na internet existe uma série de sites onde você pode pegar scripts bem bacanas que permitem à você agilizar suas tarefas de DBA.

Por exemplo, se você consultar o site da OTN ORACLE (especificamente a thread => https://forums.oracle.com/thread/906823), você vai se deparar com o
recurso DBMS_METADATA, que permite te extrair uma série de comandos DDL e DSL do dicionário do ORACLE.

Connecte-se no SQL*PLUS como o usuário "123" e execute o script abaixo:

Selecionar tudo

set heading off
set pages 0
set long 9999999
select dbms_metadata.get_granted_ddl('ROLE_GRANT', user)  
from dual;
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', user)  
from dual;
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', user)  
from dual;
Você vai notar que estes comandos te monstram TODAS as permissões atrbuidas para o usuário "123".

Espero que tenha conseguido esclarecer suas dúvidas. Fique à vontade para perguntar mais sobre este tema.

Pode ser que os outros foristas tenham outras dicas interessantes para ajudar em seu trabalho.

Abraços,

Sergio Coutinho
Responder
  • Informação