terça-feira, 1 de novembro de 2011

Tabelas em modo de leitura (read-only) no Oracle 11g


Em versões anteriores do Oracle ao 11g, não existia a possibilidade de ter tabelas em modo de leitura (read-only). Para que os usuários do banco de dados pudessem somente ler as informações das tabelas, o DBA tinha que conceder somente o privilégio de SELECT na tabela desejada, não permitindo mais operações. A partir da versão 11g o banco de dados permite que as tabelas sejam configuradas somente em modo de leitura (read-only) usando o comando ALTER TABLE.

Deve-se utilizar:

Para habilitar o modo de leitura:

ALTER TABLE table_name READ ONLY;
  
Para habilitar o modo de gravação:

ALTER TABLE table_name READ WRITE;

A seguir será demonstrada a criação de uma tabela, a inserção de uma linha, na sequência a tabela será colocada em modo de leitura (read-only).

Criando a tabela:

CREATE TABLE TABELA_LEITURA (id NUMBER);

Inserindo uma linha na tabela criada:

INSERT INTO TABELA_LEITURA VALUES (1);
  
Alterando a tabela para o modo de leitura (read-only):

ALTER TABLE TABELA_LEITURA READ ONLY;

Depois de alterar a tabela para o modo de leitura. Qualquer comando DML executado pelo banco de dados que afete os dados da tabela e o comando “SELECT...FOR UPDATE” apresentarão a mensagem de erro ORA-12081, indicando que a operação não é permitida.


ORA-12081: update operation not allowed on table "string"."string"

SQL> INSERT INTO TABELA_LEITURA VALUES (2);
INSERT INTO TABELA_LEITURA VALUES (2)
            *
ERROR at line 1:
ORA-12081: update operation not allowed on table "DEMO"."TABELA_LEITURA"

SQL> UPDATE TABELA_LEITURA SET id = 2;
UPDATE TABELA_LEITURA SET id = 2
       *
ERROR at line 1:
ORA-12081: update operation not allowed on table "DEMO"."TABELA_LEITURA"

SQL> DELETE FROM TABELA_LEITURA;
DELETE FROM TABELA_LEITURA
            *
ERROR at line 1:
ORA-12081: update operation not allowed on table "DEMO"."TABELA_LEITURA"

Declarações DDL que também afetam os dados da tabela serão restringidas.

SQL> TRUNCATE TABLE TABELA_LEITURA;
TRUNCATE TABLE TABELA_LEITURA
               *
ERROR at line 1:
ORA-12081: update operation not allowed on table "DEMO"."TABELA_LEITURA"

SQL> ALTER TABLE TABELA_LEITURA ADD (description VARCHAR2(50));
ALTER TABLE TABELA_LEITURA ADD (description VARCHAR2(50))
*
ERROR at line 1:
ORA-12081: update operation not allowed on table "DEMO"."TABELA_LEITURA"

As operações de criação de índices associados à tabela NÃO são afetadas pela restrição de leitura.

Após a alteração da tabela para o modo de gravação (read-write) as operações de DML e DDL voltarão ao normal, conforme demonstrado.

Alterando a tabela para o modo de gravação (read-write):


SQL> ALTER TABLE TABELA_LEITURA READ WRITE;
Table altered.

Removendo as linhas da tabela:

SQL> DELETE FROM TABELA_LEITURA;
1 row deleted.

O status de leitura das tabelas é exibido através da coluna READ_ONLY nas visões [DBA ​​| ALL | USER]_TABLES.



Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com