ORA-02030: can only select from fixed tables/views

Pra quem não conhece, o oracle possue algumas tabelas que podem visualizar os dados brutos no banco de dados.
Estas tabelas começão com a string “x$”.
Muita gente nem nunca ouviu falar sobre as tabelas x$ pois estas tabelas raramente são mencionadas na documentação do oracle ou na comunidade de usuários.

Mas suponhamos que você precise de alguma informação no oracle e por motivos de performance você encontrou alguma solução ideal utilizando essas tabelas?
Porem você precisa ter permisões para acessa-las com outro usuário sem ser o sysdba.

Ao efetuar os grants você recebe esta mensagem de erro.

Enter user-name: / as sysdba
 
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL> grant select on x$kgllk to lana;
grant select on x$kgllk to lana
                *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views

Conforme documentado na próprio oracle. As tabelas x$ não podem receber nenhum comando dml de nenhum usuário, nem mesmo o famoso sys.
Então não se preocupe, em trabalhar com estas tabelas, pois as mesmas tem seus dados inalterados.
Porem você não pode efetuar grant destas tabelas para ninguém.
Então a solução deste problema vem abaixo.
Primeiro precisaremos criar uma visão desta tabela.

SQL> create view v_x$kgllk as select * from x$kgllk;
 
View created.

Após este procedimento devemos efetuar o grant sobre a visão recem criada.


SQL> grant select on v_x$kgllk to lana;

Grant succeeded.
Agora esta liberado o acesso a esta tabela.
Para acessar as outras tabelas você deverá efetuar o mesmo procedimento.
Caso você queira efetuar isso para todas as tabelas x$ segue abaixo um pequeno script.


select
  'create or replace view X_$' || substr(name, 3) ||
  ' as select * from ' || name || ';'
from sys.v_$fixed_table
where name like 'X$%';

OBS:
Este erro “ORA-02030: can only select from fixed tables/views”
Também pode ocorrer caso você tente efetuar os grants para as visões v$ ou gv$
conforme abaixo.


SQL> conn / as sysdba
Connected.
SQL> grant select on gv$session_wait to lana;
grant select on gv$session_wait to lana
                *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views

Neste caso basta você adicionar um _ (underline) antes da string “$”, que resolverá seu problema.

SQL> grant select on gv_$session_wait to lana;
 
Grant succeeded.

Qualquer duvida favor comentar.

%name ORA 02030: can only select from fixed tables/views

Autor: Leandro Lana

Trabalho com banco de dados Oracle desde 2006, já trabalhei com as plataformas 9i, 10G, 11G, 12C, 18C, 19C e 21(ainda em testes).

Trabalhando atualmente como consultor Oracle na MigraTI Soluções em TI como administrador de banco de dados Oracle, SQL-Server, MySQL e Postgresql.

Contato: leandro.lana@migrati.com.br

Fone: (47) 9191-6052 / (47) 3328 0996

Certificações:

OCA 10G.

OCP 10G.

OCE Linux.

OCE RAC/Cluster.

MCP SQL-Server 2008.

MCITP SQL-Server 2008.

DB2 Fundamentals.