Evite que objetos importantes sejam apagados

Veja nesta dica como evitar que objetos importantes sejam apagados no Oracle.


Evite que objetos importantes sejam apagados

O script SQL abaixo está fundamentado no uso da tabela SECURED_OBJECTS e um trigger CHECK_BEFOREDROP para prevenir que determinados objetos sejam apagados. O trigger verifica se o objeto que você tenta apagar está na tabela. Caso positivo, um erro acontece e o objeto não é apagado.

Este script é útil se o DBA quiser prevenir objetos críticos de serem apagado - até mesmo se o dono do schema tenta apagar seus próprios objetos.

SQL> conn / as sysdba
Connected.
Criando a tabela SECURED_OBJECTS:
SQL> create table secured_objects(
2 object_name varchar2(30),
3 owner varchar2(30)
4 );
Table created.
Inserindo os objetos que estarão protegidos contra deleção:
SQL> insert into secured_objects(object_name,owner)
2 select object_name,owner
3 from all_objects
4 where object_type = 'TABLE' and
5 owner='SH';
17 rows created.
Criando a trigger CHECK_BEFOREDROP:
SQL> CREATE OR REPLACE TRIGGER check_beforedrop
2 BEFORE DROP ON DATABASE
3 DECLARE
4 oname char(30);
5 BEGIN
6 select object_name into oname
7 from secured_objects
8 where upper(object_name)=ora_dict_obj_name;
9 if sql%found then
10 RAISE_APPLICATION_ERROR(-20001, 'Object is protected. Contact you DBA.');
11 end if;
12 EXCEPTION
13 WHEN no_data_found
14 then dbms_output.put_line('Dropped !!!');
15 end;
16 /
Trigger created.
Agora vamos testar o que acabamos de construer:
SQL> select * from secured_objects; 
OBJECT_NAMEOWNER
------------------------------  ------------------------------
SALESSH
COSTSSH
TIMESSH
PRODUCTSSH
....
SQL> conn sh/sh
Connected.
SQL> drop table sales;
drop table sales
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Object is protected. Contact your DBA.
ORA-! 06512: at line 8
Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados