MENU

quinta-feira, 14 de junho de 2012

READ ONLY table? Abordando uma nova funcionalidade do Oracle 11g


Para permitir o acesso somente leitura a uma tabela no banco de dados Oracle, normalmente utilizamos a sintaxe GRANT SELECT ON [tabela] TO [usuario], ou seja, somente o privilégio de objeto SELECT será dado pelo usuário proprietário da tabela a um outro usuário do banco de dados. Bem, e se quisermos que o proprietário da tabela também tenha acesso somente leitura a esta tabela? Por padrão, o proprietário (owner) da tabela não possui nenhuma restrição de escrita em suas próprias tabelas e, neste caso, para que o proprietário da tabela tenha acesso somente leitura à tabela, seria necessário criar uma TRIGGER de banco de dados que restringiria operações de INSERTUPDATE e DELETE na tabela, ou até mesmo uma outra solução mais simples, como a de criar uma restrição CHECK no estado DISABLE VALIDATE como demonstrado abaixo:

oracle11g@linux-abr6:~> sqlplus / as sysdba
QL*Plus: Release 11.1.0.6.0 - Production on Sex Mai 2 19:15:56 2008
S Copyright (c) 1982, 2007, Oracle. All rights reserved.
11.1.0.6.0
Conectado a: Oracle Database 11g Enterprise Edition Releas e- Production
tioning, OLAP, Data Mining and Real Application Testing options SQL> conn sc
With the Part iott/tiger Conectado. SQL> create table test (id number); Tabela criada.
d constraint chk_read_only check(
SQL> insert into test values (1); 1 linha criada. SQL> alter table test a
d1=1) DISABLE VALIDATE;
abela alterada.
T
L> insert into test values (2);
S Q
nsert into test values (2)
i* ERRO na linha 1:
serção/atualização/deleção na tabela com restrição (SCOTT.CHK_READ_ONL
ORA-25128: Não há i nY) desativada e validada
update test set id=2;
SQL>
pdate test set id=2
u* ERRO na linha 1:
serção/atualização/deleção na tabela com restrição (SCOTT.CHK_READ_ONL
ORA-25128: Não há i nY) desativada e validada
delete from test;
SQL>
elete from test
d*
O na linha 1: OR
ER
RA-25128: Não há inserção/atualização/deleção na tabela com restrição
(SCOTT.CHK_READ_ONLY) desativada e validada
truncate table test;
SQL>
runcate table test
t* ERRO na linha 1:
serção/atualização/deleção na tabela com restrição (SCOTT.CHK_READ_ONL
ORA-25128: Não há i
nY) desativada e validada

Em resumo, se houver uma restrição DISABLE VALIDATE, então nenhuma modificação será permitida nas colunas restringidas, ou seja, qualquer comando DML e/ou DDL (truncate) não será permitido. Para informações adicionais, no artigo deFevereiro de 2008, eu descrevo sobre algumas funcionalidades dos estados das restrições de integridade.

Aliás, se você percebeu, eu estou conectado a um banco de dados Oracle 11g (11.1.0.6.0) e isso não é por acaso. Nas versões anteriores ao Oracle 11g, para criarmos uma tabela somente leitura teríamos que usar um dos métodos mencionados acima, mas agora poderemos utilizar a facilidade do comando ALTER TABLE que foi aprimorado no Oracle 11g para permitir alterar o estado de uma tabela do modo READ WRITE para o modo READ ONLY e vice versa.


Para demonstrar esta nova funcionalidade, irei criar uma nova tabela de teste.

SQL> drop table test;
Tabela eliminada.
st (id number); Tabela criada. SQ
SQL> create table t eL> insert into test values (1); 1 linha criada.
-- Acessando a view USER_TABLES, podemos verificar que a tabela não está no modo
-- somente leitura
SQL> select table_name, read_only from user_tables;
TABLE_NAME READ_ONLY
EST
------------------------------ ---------
TNO
-- Alterando a tabela para o modo somente leitura
SQL> alter table test READ ONLY;
abela alterada.
T
L> select table_name, read_only from user_tables;
S QTABLE_NAME READ_ONLY
EST
------------------------------ ---------
TYES
QL> insert into test values (2);
S
nsert into test values (2)
i * ERRO na linha 1:
ualização não permitida na tabela "SCOTT"."TEST" SQL>
ORA-12081: operação de a
tupdate test set id=2;
update test set id=2
* ERRO na linha 1:
de atualização não permitida na tabela "SCOTT"."TEST" SQL>
ORA-12081: operaçã
odelete from test;
delete from test
*
linha 1: ORA-12
ERRO n
a081: operação de atualização não permitida na tabela "SCOTT"."TEST"
QL> truncate table test;
S
runcate table test
t *
ha 1: ORA-12081:
ERRO na li
n operação de atualização não permitida na tabela "SCOTT"."TEST"

Então, uma vez que a tabela esteja no modo somente leitura (READ ONLY), nenhum comando DML ou comando DDL (truncate) que modifiquem os dados da tabela não poderão ser executados. Inclusive, os comandos MERGE ou até sentenças SELECT FOR UPDATE não serão permitidos. No meu ponto de vista, esta funcionalidade acrescentada ao comando ALTER TABLE é de muita utilidade quando por algum motivo precisarmos de forma fácil e rápida restringir o acesso de escrita aos usuários nas tabelas do banco de dados.

-- Alterando o modo da tabela para permitir operações de escrita
SQL> alter table test READ WRITE;
abela alterada.
T
L> select table_name, read_only from user_tables;
S QTABLE_NAME READ_ONLY
EST
------------------------------ ---------
TNO
QL> drop table test;
S
bela eliminada.
T a


Nenhum comentário:

Postar um comentário