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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top