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_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