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...)
  

Mensagemem Qua, 08 Fev 2017 6:47 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:

Código: Selecionar todos
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:

Código: Selecionar todos
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?
ThiagolRamos

Mensagemem Qua, 08 Fev 2017 8:29 am

Bom dia Thiago,

veja se ajuda...

crio o usuário desta forma:

Código: Selecionar todos
create user joao identified by joao
default tablespace dados
temporary tablespace temp
account unlock;


Código: Selecionar todos
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:
Código: Selecionar todos
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.
spernega
Localização: São Paulo - SP

Mensagemem Qua, 08 Fev 2017 8:43 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.
ThiagolRamos

Mensagemem Qua, 08 Fev 2017 8:56 am

Thiago,

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

Código: Selecionar todos
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

Código: Selecionar todos
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
Localização: São Paulo - SP

Mensagemem Qua, 08 Fev 2017 8:59 am

Thiago,

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

Drop synonym nome
spernega
Localização: São Paulo - SP

Mensagemem Qua, 08 Fev 2017 1:12 pm

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.
ThiagolRamos

Mensagemem Qui, 09 Fev 2017 8:00 am

bom dia thiago,

só por curiosidade, conseguiu resolver?
spernega
Localização: São Paulo - SP

Mensagemem Qui, 09 Fev 2017 8:30 am

Thiago,

Bom dia,

Uma sugestão de roteiro:

A) Criação de uma role (CREATE ROLE ..)
B) Criação de usuário (CREATE USER .. DEFAULT TABLESPACE .. TEMPORARY TABLESPACE);
C) Permissões minimas de sistema (GRANT CREATE SESSION .. GRANT ALTER SESSION .. QUOTA 0 ON TABLESPACE ..
);
D) Atribuição de SELECTS de algumas tabelas para a role (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 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.
Razão: Mencionando tópico que havia esquecido (F)
stcoutinho
Localização: Sao Paulo - SP

Mensagemem Qui, 09 Fev 2017 8:58 am

Boa stcoutinho,

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

Aprendi mais uma.

valeu!
spernega
Localização: São Paulo - SP

Mensagemem Qui, 09 Fev 2017 9:48 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.

Select * from NOMEBANCO.NOMETABELA

Obrigado
ThiagolRamos

Mensagemem Qui, 09 Fev 2017 10:07 am

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

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
spernega
Localização: São Paulo - SP



Voltar para DBA Geral

Quem está online

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