Dúvida criação de usuário para consulta

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
ThiagolRamos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 03 Nov 2015 9:53 am

Bom dia Srs,

Estou com uma dúvida que provavelmente é simples, mas não encontrei em outro local a resposta.

No banco de dados do ERP temos um usuário criado, ele tem como padrão o schema do ERP, com isso, quando acesso o banco utilizando este usuário para fazer alguma consulta basta eu digitar o nome da tabela no select:

Selecionar tudo

SELECT * FROM NOMETABELA
Estou com uma nova aplicação e por segurança criei um novo usuário, coloquei o schema do ERP como padrão também, e dei permissão apenas de select e em algumas tabelas apenas.

A minha dúvida é com relação a consulta, quando tento executar o mesmo select acima, ele diz que não encontra a tabela, para que funcione o select nesse usuário eu preciso colocar o nome completo do local:

Selecionar tudo

SELECT * FROM NOMEBANCO.NOMETABELA
Alguém saberia me dizer como faço para ele conseguir localizar as tabelas de forma "normal" como o primeiro usuário?
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia Thiago,

veja se ajuda...

crio o usuário desta forma:

Selecionar tudo

create user joao identified by joao
default tablespace dados
temporary tablespace temp
account unlock;

Selecionar tudo

grant create session, "nome da role do seus usuários" to joao;
Em relação ao owner, ele cria sinônimos para os seu objeto.

Aqui eu crio:

Selecionar tudo

Create or repace public synonym nome_tabela for nome_tabela.
precisa ver se no seu ERP o sinônimo foi criado como publico ou especifico para alguma role.
ThiagolRamos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 03 Nov 2015 9:53 am

Bom dia spernega,

O usuário já havia sido criado dessa forma.

No caso então, o meu problema está sendo por conta desses sinônimos apenas?

Veja, não é algo que vai me impedir de utilizar o usuário, apenas incomoda ter que colocar o nome inteiro para fazer alguma consulta.
Queria melhorar isso já que no usuário padrão não tem.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Thiago,

Tenta fazer uma SELECT pra ver o tipo de synonym que foi criado para o objeto.

Selecionar tudo

select * from sys.SYNONYMS where creator = 'NOME DO OWNER' and TNAME = "NOME DE UMA TABELA";
Se o SYNTYPE não for publico, faça um teste conectado como owner

Selecionar tudo

create public synonym 'NOME DA TABELA'  for 'NOME DA TABELA'.
daí veja se ainda precisa informar o owner no select

Se não resolver a gente pensa mais um pouco.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Thiago,

Se for criar o sinônimo publico, talvez você tenha que dropar antes

Drop synonym nome
ThiagolRamos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 03 Nov 2015 9:53 am

Fiz essa pesquisa, utilizando o usuário do ERP e não encontrei nada. Não há nenhum sinonimo criado por este usuário.

Acessei então com o usuário SYSTEM E SYS e procurei dessa vez pelo TNAME, pegando uma tabela qualquer, nada também.

Estranho, mas entendi o conceito e como ser feito.

Obrigado pela ajuda.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

bom dia thiago,

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

Thiago,

Bom dia,

Uma sugestão de roteiro:

A) Criação de uma role (CREATE ROLE ..)
B) Criação de usuário

Selecionar tudo

CREATE USER .. DEFAULT TABLESPACE .. TEMPORARY TABLESPACE
C) Permissões minimas de sistema

Selecionar tudo

GRANT CREATE SESSION .. GRANT ALTER SESSION .. QUOTA 0 ON TABLESPACE
D) Atribuição de SELECTS de algumas tabelas para a role

Selecionar tudo

GRANT SELECT ON  .. TO <NOME_ROLE>
E) Criação de sinônimo PRIVADO apontando para os objetos do ERP. Digamos que você criou um usuário CONSULTA e o schema do ERP se chama ERP_OW. Seu comando para criar sinônimo privado seria

Selecionar tudo

CREATE OR REPLACE SYNONYM CONSULTA.<NOME_TABELA> FOR ERP_OW.<NOME_TABELA);
F) Havia me esquecido, mas você precisa também atribuir a role para seu usuário (ex: GRANT <NOME_ROLE> TO CONSULTA);
Creio que com isso você não terá problemas em acessar como o "CONSULTA" e fazer os SELECTS, sem a necessidade de mencionar o ERP_OW antes do nome da tabela.

Nada contra um sinônimo PUBLICO, mas você teria problemas se nesta instâncias existissem outras tabelas com o mesmo nome, mas pertencendo a schemas diferentes (um sinonimo público só aponta para um único objeto de schema). Com o sinônimo PRIVADO, você evitaria problemas em situações como esta.

Boa sorte,

Sergio Coutinho
Editado pela última vez por stcoutinho em Qui, 09 Fev 2017 9:12 pm, em um total de 1 vez.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Boa stcoutinho,

eu também estava em dúvida de como criar um sinônimo privado.

Aprendi mais uma.

valeu!
ThiagolRamos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 03 Nov 2015 9:53 am

Bom dia,

não, sinceramente não entendi pois não há sinônimo dessas tabelas gravadas. Com nenhum usuário.

Então não faz sentido não utilizar o nome do banco antes com um usuário e com o outro não.

Mas vou utilizar dessa forma mesmo.

Selecionar tudo

Select * from NOMEBANCO.NOMETABELA
Obrigado
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Thiago,

Eu já vi DBAs criarem visões de outros owner para outro usuário ou role visualizarem um objeto.

tenta fazer esse select e veja o que retorna

Selecionar tudo

select * from all_objects where object_name = 'NOME DA TABELA';

Num caso que eu tenho no meu sistema, retorna o seguinte:
OWNER                          OBJECT_NAME                    SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE        
------------------------------ ------------------------------ ------------------------------ ---------- -------------- -------------------
PUBLIC                         IMPORT_CLI                                                        264538                SYNONYM
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes