Picture of Roberto Sobrinho
Roberto Sobrinho

26/08/2024

Como Impedir que o Owner de uma Tabela Altere seus Dados no Oracle


No Oracle Database, o owner (proprietário) de uma tabela possui, por padrão, todos os privilégios necessários para realizar operações de leitura e escrita em suas tabelas. No entanto, em algumas situações, pode ser necessário restringir as operações de escrita mesmo para o owner, garantindo que os dados permaneçam imutáveis e protegidos contra alterações acidentais ou não autorizadas.

Neste post, exploraremos duas técnicas eficazes para impedir que o owner de uma tabela altere seus dados no Oracle Database:

  1. Utilizando uma restrição CHECK no estado DISABLE VALIDATE
  2. Alterando o estado da tabela para READ ONLY

Vamos abordar cada uma dessas técnicas em detalhes, fornecendo exemplos práticos e explicações claras sobre como implementá-las.


1. Utilizando Restrição CHECK no Estado DISABLE VALIDATE

A técnica de usar uma restrição CHECK no estado DISABLE VALIDATE é uma maneira eficaz de impedir qualquer operação de escrita em uma tabela, incluindo INSERT, UPDATE, DELETE e TRUNCATE. Essa abordagem aproveita uma característica específica do Oracle, onde uma restrição CHECK desativada (DISABLE) e validada (VALIDATE) bloqueia operações de modificação de dados.

1.1. Como Funciona o Estado DISABLE VALIDATE?

Para entender melhor como essa técnica funciona, precisamos explorar o que cada estado de uma restrição CHECK significa:

VALIDATE: Essa cláusula garante que, quando a restrição foi criada ou alterada, todos os dados existentes na tabela cumpriam a condição da restrição. Mais importante, quando uma restrição está em estado VALIDATE, ela impede qualquer modificação nos dados caso a restrição esteja desabilitada.

CHECK (1=1): Essa é uma condição que sempre retorna verdadeiro, ou seja, não impõe nenhuma restrição prática sobre os dados.

DISABLE: Quando uma restrição é desabilitada (DISABLE), o Oracle não a verifica durante operações de DML (Data Manipulation Language), como INSERT, UPDATE ou DELETE. Isso significa que a restrição não é aplicada aos dados que estão sendo inseridos ou atualizados.

A combinação de DISABLE VALIDATE em uma restrição CHECK cria um estado em que qualquer tentativa de modificação dos dados, incluindo inserções, atualizações ou deleções, é bloqueada. Isso ocorre porque, no Oracle, uma restrição que foi desativada, mas validada, impede qualquer alteração nos dados da tabela. Dessa forma, a integridade da tabela é mantida, garantindo que nenhuma modificação possa ser feita enquanto a restrição estiver nesse estado.

1.2. Exemplo Prático

Vamos aplicar essa técnica à tabela HR.FUN:

sqlplus hr/hr@pdb1

SQL>  show user
USER is "HR"

SQL> CREATE TABLE HR.FUN (
  ID NUMBER,
  NOME VARCHAR2(50),
  CARGO VARCHAR2(50),
  SALARIO NUMBER
);

Table created.

SQL> INSERT INTO HR.FUN (ID, NOME, CARGO, SALARIO) VALUES (1, 'Bino Silva', 'DBA', 5000);

1 row created.

SQL> INSERT INTO HR.FUN (ID, NOME, CARGO, SALARIO) VALUES (2, 'Dimas Santos', 'DEV', 4500);

1 row created.

SQL> COMMIT;

Commit complete.

Agora, adicionamos a restrição CHECK no estado DISABLE VALIDATE:

SQL> ALTER TABLE HR.FUN ADD CONSTRAINT chk_leitura CHECK (1=1) DISABLE VALIDATE;

Table altered.

1.3. O Que Acontece Agora?

Depois de adicionar essa restrição, qualquer tentativa de modificação dos dados resultará em erro. Isso inclui operações de INSERT, UPDATE, DELETE e TRUNCATE. Veja o que acontece quando tentamos fazer essas operações:

sqlplus hr/hr@pdb1

SQL>  show user
USER is "HR"

SQL> INSERT INTO HR.FUN (ID, NOME, CARGO, SALARIO) VALUES (3, 'Guina  Silva', 'Gerente', 7000);
INSERT INTO HR.FUN (ID, NOME, CARGO, SALARIO) VALUES (3, 'Maria Oliveira', 'Gerente', 7000)
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (HR.CHK_LEITURA) disabled and validated


SQL> UPDATE HR.FUN SET SALARIO = 5500 WHERE ID = 1;
UPDATE HR.FUN SET SALARIO = 5500 WHERE ID = 1
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (HR.CHK_LEITURA) disabled and validated


SQL> DELETE FROM HR.FUN WHERE ID = 2;
DELETE FROM HR.FUN WHERE ID = 2
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (HR.CHK_LEITURA) disabled and validated


SQL> TRUNCATE TABLE HR.FUN;
TRUNCATE TABLE HR.FUN
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (HR.CHK_LEITURA) disabled and validated

1.4. Por que Essa Técnica é Útil?

Proteção: Essa técnica é extremamente útil quando você precisa garantir que uma tabela permaneça imutável. Isso pode ser necessário em cenários onde os dados são críticos e não podem ser alterados de forma alguma, nem mesmo pelo owner da tabela.

Simplicidade: Ao contrário de outras abordagens que podem envolver triggers complexas ou procedimentos armazenados, a combinação DISABLE VALIDATE é simples de implementar e muito eficaz.

Flexibilidade: Se em algum momento for necessário permitir novamente as operações de escrita, você pode facilmente reverter essa configuração:

SQL> ALTER TABLE HR.FUN ENABLE CONSTRAINT chk_leitura;

Table altered.

1.4. Possíveis Cenários de Uso

Tabelas de Log: Em sistemas onde os logs são essenciais e não devem ser alterados uma vez inseridos.

Bases de Referência: Para tabelas que contêm dados de referência críticos, onde qualquer modificação pode comprometer a integridade dos sistemas dependentes.

Períodos de Congelamento: Em períodos de auditoria ou fechamento de balanço, onde alterações em dados históricos são proibidas.

2. Alterando a Tabela para READ ONLY

Outra abordagem eficiente é alterar o estado da tabela para READ ONLY usando o comando ALTER TABLE. Quando uma tabela está neste estado, todas as operações de escrita são proibidas, independentemente dos privilégios do usuário.

2.1. Criando a Tabela de Exemplo

Vamos criar outra tabela de exemplo chamada HR.DEP:

sqlplus hr/hr@pdb1

SQL>  show user
USER is "HR"

SQL> CREATE TABLE HR.DEP (
  ID NUMBER,
  NOME VARCHAR2(50),
  LOCALIZACAO VARCHAR2(50)
);

Table created.


SQL> INSERT INTO HR.DEP (ID, NOME, LOCALIZACAO) VALUES (10, 'RH', 'São Paulo');

1 row created.

SQL> INSERT INTO HR.DEP (ID, NOME, LOCALIZACAO) VALUES (20, 'PIRAJA', 'Rio de Janeiro');

1 row created.

SQL> COMMIT;

Commit complete.

2.2. Alterando o Estado da Tabela para READ ONLY

SQL> ALTER TABLE HR.DEP READ ONLY;

Table altered.

O comando acima torna a tabela somente leitura, impedindo quaisquer operações de escrita.

2.3. Tentando Realizar Operações de Escrita

SQL> INSERT INTO HR.DEP (ID, NOME, LOCALIZACAO) VALUES (30, 'Marketing', 'Belo Horizonte');
INSERT INTO HR.DEP (ID, NOME, LOCALIZACAO) VALUES (30, 'Marketing', 'Belo Horizonte')
*
ERROR at line 1:
ORA-12081: update operation not allowed on table "HR"."DEP"


SQL> UPDATE HR.DEP SET LOCALIZACAO = 'Curitiba' WHERE ID = 10;
UPDATE HR.DEP SET LOCALIZACAO = 'Curitiba' WHERE ID = 10
*
ERROR at line 1:
ORA-12081: update operation not allowed on table "HR"."DEP"


SQL> DELETE FROM HR.DEP WHERE ID = 20;
DELETE FROM HR.DEP WHERE ID = 20
*
ERROR at line 1:
ORA-12081: update operation not allowed on table "HR"."DEP"


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

A tabela permanece acessível para operações de consulta (SELECT).

Para reverter o estado e permitir operações de escrita novamente:

SQL> ALTER TABLE HR.DEP READ WRITE;

Table altered.


Ambas as técnicas apresentadas são eficazes para impedir que o owner de uma tabela realize operações de escrita nos dados. A escolha entre elas depende das necessidades específicas e do contexto em que serão aplicadas:

  • Restrição CHECK DISABLE VALIDATE:
    • Simples de implementar.
    • Fácil de gerenciar através de comandos de habilitação e desabilitação da restrição.
    • Pode ser específica para determinadas colunas ou condições.
  • Estado READ ONLY:
    • Aplica-se a toda a tabela de forma abrangente.
    • Útil para situações onde a tabela inteira deve permanecer imutável por um período.
    • Fácil de alternar entre os estados READ ONLY e READ WRITE conforme necessário.


🚬🫥 #20240826 #JuanEnsinou #AnnaDoPapai #Barato #FuradoIgualPeneira #GuinaNãoTinhaDó #CenaPorCena #DimasPrimeiroVidaLoka #NãoQueroAdmitir #PrimeiraBarcaDiplomata 🫥🚬


Compartilhe

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print

Pesquisar

Roberto Sobrinho

Sou Roberto Fernandes Sobrinho, também conhecido como Sobrinho DBA , pós graduado em “Architecture and Database Administration”, entusiasta, dedicado e com 20 anos de experiência com Oracle Database e suas diversas distribuições e variações.

Oracle ACE Associate

2025

Specialist

Exadata Database Machine X9M

Professional

Oracle Database Administration

Professional

Oracle Database 19c: RAC, ASM, & Grid Infra Administrator

Professional

Oracle Autonomous Database Cloud

Professional

Oracle Cloud Database Migration and Integration

Professional

Oracle Database PL/SQL Developer

Associate

Oracle Cloud Infrastructure Architect

Associate

Oracle Cloud Infrastructure Foundations

Categorias

Categorias

Tags

Como Impedir que o Owner de uma Tabela Altere seus Dados no Oracle