Considere o seguinte cenário em um banco de dados Oracle 11g .
O usuário ADMIN realiza o seguinte:
CREATE USER Alice IDENTIFIED BY pwdalice;
GRANT CREATE SESSION TO Alice;
CREATE ROLE Viewer IDENTIFIED BY pwdviewer;
GRANT Viewer TO Alice;
GRANT SELECT ON Table_1 TO Viewer;
Em seguida, Alice faz login no banco de dados como 'Alice' e executa o seguinte comando:
SELECT * FROM Table_1;
Alice recebe o seguinte erro:
SELECT * FROM Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
Eu pensei que conceder privilégios a uma função permitiria que seus usuários-membros obtivessem esses privilégios. No entanto, este cenário mostra que não é assim. O que estou perdendo aqui? Como posso conceder SELECT a Alice usando uma função?
Atualizar:
Seguindo as respostas, tentei 3 correções sem sucesso
1) Usando nomes de tabela totalmente qualificados
Eu deixei de incluir o nome do esquema no SELECT * FROM Table_1;
comando. No entanto, mesmo depois de adicionar o nome do esquema conforme mostrado abaixo, ainda ocorre o erro.
Alice executa:
SELECT * FROM ADMIN.Table_1;
Obtém o erro:
SELECT * FROM ADMIN.Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
2) Usando um sinônimo para o nome da tabela totalmente qualificado
Infelizmente, isso também não parece resolver o problema.
Alice executa o seguinte:
CREATE SYNONYM Syn_Table_1 FOR ADMIN.Table_1;
CREATE SYNONYM Syn_Table_1 FOR ADMIN.Table_1
*
ERROR at line 1:
ORA-01031: insufficient privileges
3) Alterando a sessão
ALTER SESSION SET current_schema = ADMIN;
Session altered.
SELECT * FROM Table_1;
SELECT * FROM Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
Além de garantir que você esteja no esquema correto, experimente este;
Uma vez logado como Alice, faça:
SET ROLE Viewer IDENTIFIED BY pwdviewer;
Para mais veja aqui
A função que você criou é protegida por senha. Portanto, não é ativado por padrão, quando alice faz login.
Você precisa usar o nome totalmente qualificado da tabela, pois
Alice
não possui a tabela.Por exemplo, se a tabela for de propriedade de
TABLE_1_OWNER
:`Alice também pode criar um sinônimo em seu próprio esquema que aponte para a tabela, eliminando assim a necessidade de qualificar totalmente o nome:
O problema é de resolução de nomes, não de privilégios.
A tabela
table_1
existe em algum esquema diferente doAlice
esquema. QuandoAlice
executa a consultaO Oracle examinará o esquema atual para ver se existe um objeto chamado
table_1
. Como não existe tal objeto, ele lança um erro.Você pode corrigir isso informando ao Oracle em qual esquema o objeto reside qualificando o nome da tabela
Como alternativa, você pode criar um sinônimo (público ou privado) que forneça o mapeamento. Como Alice, por exemplo, você pode criar um sinônimo privado
Depois de fazer isso, Alice pode simplesmente
porque há um objeto no esquema de Alice chamado
table_1
(um sinônimo privado para a tabela real).Uma terceira opção seria alterar o esquema atual para a sessão. Novamente, como Alice, se você correr
então você será capaz de correr
Se você fizer isso, no entanto, terá que qualificar totalmente os nomes das tabelas se existirem no esquema de Alice (a menos, é claro, que você altere
current_schema
novamente).se você ainda tiver esse problema após aplicar a abordagem de prática recomendada de sinônimos e privilégios concedidos a funções, certifique-se de que a conta de usuário do beneficiário tenha todas as funções habilitadas: ALTER USER DEFAULT ROLE ALL
Além disso, vejo que você precisa fazer uma nova conexão com o usuário para permitir a concessão via role. Uma reconexão "simples" não funciona.
Por padrão, o nome do administrador é sistema.
Então, quando Alice fizer login no banco de dados como 'Alice' e executar o seguinte comando:
Nota: verifique o usuário a quem a tabela pertence, digamos se a tabela pertence ao usuário shub write query como:
Se você não resolveu esse problema, tente primeiro criar a função e adicionar as permissões correspondentes. Em seguida, crie o usuário e atribua a função a ele.
Nesta ordem, acho que deve funcionar. Funcionou para mim e eu estava tendo os mesmos problemas que você estava enfrentando.
Em situação semelhante, a seguir funcionou para mim.
sqlplus / como sysdba
conceder conectar, recurso, criar visualização, selecionar qualquer tabela, criar sinônimo, selecionar qualquer dicionário para [seu usuário];
Eu sei que esta solução não está ociosa para todos os casos, mas esse foi meu último recurso.