Oracle 9i: Synonymed tabela não existe?
Pergunta
Eu criei um pacote que contém um procedimento armazenado que eu pretendo chamar de um aplicativo separado. O procedimento armazenado retornará uma lista ordenada de todos os pontos de vista e tabelas no esquema. Para fazer isso, ele executa uma simples escolha sobre os sinônimos DBA_TABLES e DBA_VIEWS, como mostrado abaixo:
CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS
PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
IS
V_CURSOR T_CURSOR;
BEGIN
OPEN V_CURSOR FOR
SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME
FROM DBA_TABLES
WHERE OWNER = 'SONAR5'
UNION ALL
SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME
FROM DBA_VIEWS
WHERE OWNER = 'SONAR5'
ORDER BY OBJECTNAME;
RESULTS := V_CURSOR;
END GETSCHEMAOBJECTS;
END TITAN_ENTITY;
Eu tenho verificado que os sinônimos em exist pergunta, e são públicos:
CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"
O meu entendimento é que, porque eles são públicos, eu não preciso de quaisquer outras permissões para chegar até eles. Se esse entendimento é incorreto, eu gostaria que alguém me desenganar da noção e me aponte para dados mais precisos.
Agora, aqui está o meu problema: eu posso abrir uma planilha no Oracle SQL Developer e escolha entre essas tabelas muito bem. Recebo dados significativos apenas multa (567 linhas, como uma questão de fato). Mas quando tento executar o procedimento armazenado, a Oracle reclama com um erro de compilação, como mostrado abaixo:
Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist
Quando eu duplo clique sobre essa segunda mensagem de erro, SQL Developer me leva para a primeira cláusula FROM ( "FROM DBA_TABLES").
Então, eu estou bastante perplexo. Sei SQL Server muito bem, e eu sou novo para Oracle, por isso, tenha comigo. Se você poderia fornecer algumas pistas, ou me aponte na direção certa, eu realmente aprecio isso.
Agradecemos antecipadamente!
Solução
Use ALL_TABLES e ALL_VIEWS vez de DBA_TABLES e DBA_VIEWS. ALL_ visualizações% deve ser acessível a todos os utilizadores.
Outras dicas
Se você selecionar a partir de uma tabela ou uma visão em um-procedimento SQL / PL armazenado ou uma função SQL / PL armazenado você precisa de uma subvenção directa. A concessão através de uma função de banco não é suficiente.
Você provavelmente precisará de uma subvenção directa em vista DBA_TABLES. Sinônimos (públicos) são apenas sinônimos (públicos). Você precisa concedido directamente selecione direitos.
Veja aqui: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807
Editar: Desculpe, eu anotado sobre a parte onde você parecem dizer que você pode selecionar a partir de DBA_TABLES diretamente. Muito provavelmente o problema é que os seus privilégios são concedidos através de um papel como alguém respondeu. Mas ainda vale a pena explicar que a sua compreensão de sinônimos públicos é incompleta, e que o uso de ALL_TABLES seria melhor se ele realiza o que você precisa.
O sinônimo sendo pública apenas significa que todos os usuários podem referenciar o sinônimo; não lhes conceder qualquer acesso ao objeto que o sinônimo se refere.
O que você faria para mais diretamente resolver este erro é conceder privilégio SELECT nas vistas SYS para o usuário (s) que irá executar este procedimento. No entanto, penso que é um idéia muito ruim.
Como sugerido por Raimonds, considere se você pode obter o que você precisa de USER_TABLES ou ALL_TABLES vez. O usuário está chamando este procedimento, eo que o acesso se que o usuário tem que tabelas de SONAR5?
Geralmente, se seu aplicativo está interessado em uma mesa, provavelmente tem alguns privilégios sobre ele, caso em que é deve ser listados na ALL_TABLES.