Privilegios (Grant) no Oracle
Fala PessoAll,
Demorei, mas estamos de volta.
Dessa vez, vou dar uma dica bem simples sobre privilégios (grants) no banco Oracle.
Quem muitas vezes não foi realizar um select em uma tabela qualquer no banco de dados e obteve um ora-00942: table or view does not exist
? Pois é, este erro nem sempre é o que diz que é! Que coisa não? Muitas vezes a tabela existe só que pertence a um outro schema do banco de dados, e aí o usuário que voce está conectado não consegue enxergar este objeto. Isso pode acontecer com tabelas, views, functions, procedures
, etc o que acontece é que o schema proprietário do objeto tem que conceder a devida permissão para o usuário que você está conectado.
Vamos a um cenário, para que possamos entender esse rolo todo.
Suponhamos que em nossa base a gente tenha o usuário DONOSISTEMA que criou uma tabela chamada TABELA_BASE e você se conecta no banco com o usuário USERSISTEMA, então como faríamos para que você conseguisse acessar esta tabela?
Assim:
Primeiro vamos conectar com DONOSISTEMA e criar a tabela:
SQL> conn donosistema/oracle;
Conectado.
SQL> create table tabela_base(campo1 number, campo2 varchar2(100));
Tabela criada.
Beleza, agora vamos conectar com o usuário USERSISTEMA e tentar dar um select count(*) nesta tabela:
SQL> conn usersistema/oracle;
Conectado.
SQL> select count(*) from donosistema.tabela_base;
select * from donosistema.tabela_base
*
ERRO na linha 1:
ORA-00942: a tabela ou view nÒo existe
Parece que não deu muito certo não? Pois é, não tem privilégio.
Agora vamos conectar novamente como DONOSISTEMA e conceder o privilégio:
SQL> conn donosistema/oracle;
Conectado.
SQL> grant select on tabela_base to usersistema;
ConcessÒo bem-sucedida.
Perfeito… agora vamos conectar novamente com o usuário USERSISTEMA e tentar novamente fazer o select count(*) nessa tabela:
SQL> conn usersistema/oracle;
Conectado.
SQL> select count(*) from donosistema.tabela_base;
COUNT(*)
----------
0
Agora parece que ficou beleza não? Nosso usuário conseguiu realizar acessar a tabela sem problemas.
Só que… eu sou um cara chato! Não quero ter que colocar nome do dono do objeto na frente (DONOSISTEMA.)… na verdade não quero nem que meu usuário que vai acessar a aplicação saiba quem é o dono dos objetos, pra ele não cair em tentação! Rsrs. Para isso, precisamos criar um objeto chamado SYNONYM que nada mais é que um sinônimo (óbvio não) para o objeto original. Por exemplo, no nosso caso, temos que criar um synonym com o nome TABELA_BASE que aponte para o objeto DONOSISTEMA.TABELA_BASE certo?
Então vamos lá.
Pra não dizerem que estou mentindo (rsrs) inicialmente vou conectar como USERSISTEMA para que possamos ver que se tirar o nome do dono do objeto da frente da tabela o select não vai funcionar, vamos ver:
SQL> conn usersistema/oracle;
Conectado.
SQL> select count(*) from tabela_base;
select count(*) from tabela_base
*
ERRO na linha 1:
ORA-00942: a tabela ou view nÒo existe
Hum… realmente não funciona.
Agora vamos conectar como DONOSISTEMA e criar o synonym para esta tabela ok? vamos lá:
SQL> conn donosistema/oracle;
Conectado.
SQL> create public synonym tabela_base for donosistema.tabela_base;
Sin¶nimo criado.
Beleza. Agora vamos conectar novamente como USERSISTEMA e ver se ele consegue acessar sem o nome do dono na frente? Vamos:
SQL> conn usersistema/oracle;
Conectado.
SQL> select count(*) from tabela_base;
COUNT(*)
----------
0
Perfeito não? Que beleza!! É assim que fazemos para que tenhamos um usuário dono dos objetos do nosso banco de dados e vários outros usuários que apenas utilizam estes objetos. Desta forma organizamos nossos objetos e garantimos que fica transparente aos usuários seu acesso.
E como eu sei se tenho permissão ou não para um determinado objeto?
Simples, consultando o dicionário dados. Tentem rodar o select abaixo:
select grantor, grantee, table_name, privilege
from all_tab_privs
where grantee = 'USUARIO_RECEBEDOR_PRIVILEGIO'
and grantor = 'USUARIO_DONO_OBJETO'
and table_name = 'NOME_DO_OBJETO'
Aí vocês podem usar ou não todos os filtros que coloquei.
Aí podemos filtrar por:
GRANTOR: que é o usuário que concedeu a permissão. No nosso caso DONOSISTEMA.
GRANTEE: que é o usuário que recebeu a permissão. No nosso caso USERSISTEMA.
TABLE_NAME: que é o nome da tabela envolvida no nosso processo. No nosso caso TABLE_BASE.
É isso gente.
Espero que tenham gostado e que daqui pra frente fique tudo mais claro sobre permissões, sinônimos e etc.
Atc.
Muito bom o tutorial! Me ajudou bastante.
Amigo, e se o DONOSISTEMA não tiver permissão para criar synomym?
To tendo esse problema aqui! rsr
Rafael, obrigado pela visita, volte sempre!
Então… se o DONOSISTEMA não tem permissão de criar um “public synonym”, você terá que pedir para o seu DBA criar o sinônimo pra você ou dar o privilégio de “create public synonym” para DONOSISTEMA.
Outra opção, é acessar o objeto colocando o owner na frente, como foi o primeiro exemplo antes da criação do sinônimo.
Grande abraço.
Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com