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:
- Utilizando uma restrição CHECK no estado DISABLE VALIDATE
- 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 🫥🚬