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 sysdbaConnected.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_NAME OWNER
------------------------------ ------------------------------
SALES SH
COSTS SH
TIMES SH
PRODUCTS SH
....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