Raramente, um usuário solicita acesso a todas as tabelas e visões de um banco de dados. No entanto, sabemos que tal demanda pode vir a ocorrer. São os casos de usuários criados para gerenciamento de sistemas, extração e mineração de dados.
Agora, suponha que o setor de desenvolvimento solicitou acesso a todas as tabelas e as visões de todos os esquemas de um banco de dados, exceto do esquema SYS.
Caso o DBA execute SELECT ANY TABLE para dar as permissões solicitadas, ele estará liberando acesso inclusive as tabelas e as visões do dicinário de dados do esquema SYS.
Para evitar isso, você poderá limitar acesso as tabelas de sistema configurando o parâmetro O7_DICTIONARY_ACCESSIBILITY para falso (false).
Vamos a um exemplo para melhor entendimento.
1. Conecte a um banco de dados de teste com um usuário que tenha permissão para dar privilêgios. Neste exemplo, vamos conectar com o usuário SYSDBA pelo SQL PLUS, o comando deverá ser executado na linha de prompt de commando do Linux ou Windows.
sqlplus / sysdba
2. Crie um usuário TESTE e libere a permissão SELECT ANY TABLE, de acordo com o script abaixo:
SQL>CREATE USER TESTE IDENTIFIED BY passwordteste;
SQL>GRANT CREATE SESSION TO TESTE;
SQL>GRANT SELECT ANY TABLE TO TESTE;
O parâmetro O7_DICTIONARY_ACCESSIBILITY é configurado como verdadeiro (true), por padrão.
3. Agora execute o script abaixo e caso o parâmetro esteja como verdadeiro (true), você visualizará a estrutura da visão DBA_TABLES, que tem a descrição de todas as tabelas relacionais do banco de dados.
SQL>CONNECT TESTE;
SQL>DESC DBA_TABLES;
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER NOT NULL VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
TABLESPACE_NAME VARCHAR2(30)
CLUSTER_NAME VARCHAR2(30)
4. Nesse ponto, você configurará o parâmetro O7_DICTIONARY_ACCESSIBILITY para FALSE e reiniciará a instância de banco de dados.
SQL>ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY=TRUE SCOPE=SPFILE;
SQL>STARTUP FORCE
Total System Global Area 393375744 bytes
Fixed Size 1374836 bytes
Variable Size 306185612 bytes
Database Buffers 79691776 bytes
Redo Buffers 6123520 bytes
Database mounted.
Database opened.
5. Conecte via SQL*Plus a instância de banco de dados e com o usuário SYSDBA para se certificar que ele foi alterado;
SQL>SHOW PARAMETERS O7_DICTIONARY_ACCESSIBILITY
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
O7_DICTIONARY_ACCESSIBILITY boolean FALSE
Atenção: "O7_" antes do número 7 é a letra O em letras maiúsculas e não um zero.
6. Agora, conecte com o usuário TESTE e tente executar a instrução DESC DBA_TABLES, você receberá a mensagem do Oracle com a mensagem "raise ORA-04043: object does not exist", objeto não existe.
SQL>CONNECT TEST;
SQL>DESC DBA_TABLES;
ERROR:
ORA-04043: object does not exist
Essa mensagem é mostrada, neste caso, por que o usuário TESTE não possui mais permissões para visualizar tabelas e visões do dicionário de dados esquema SYS na instância de banco de dados Oracle.
References:
Oracle documentation
Database Reference: 1.174 O7_DICTIONARY_ACCESSIBILITY
Meu post originalmente escrito em inglês: Restricting privileges setting O7_DICTIONARY_ACCESSIBILITY on Oracle.