Muniqsoft Training

Auswahl  

Schutz vor DROP oder TRUNCATE Kommandos 

Oracle
DBA:PL/SQL
RDBMS 10.x
02.03.18 (MP)
03.07.18 (MM)
DROP, TRUNCATE, Schutz

Body

Heute widmen wir uns dem wichtigen Thema "Schutz vor dem unbeabsichtigten Löschen von wichtigen Datenbank-Objekten".
Fast jeder hat schon einmal aus Versehen das falsche Objekt gelöscht (ooops ich auch). Wenn es sich dabei um eine wichtige Applikationstabelle handelt,
ist der Reparaturaufwand oft sehr erheblich. Wenn Sie natürlich FLASHBACK DATABASE (leider nur in der Enterprise Edition erhältlich) zur Verfügung haben, geht es etwas schneller :-)

Wir erstellen uns eine Liste mit schützenswerten Objekten in einer eigenen Tabelle:

connect system/sys
CREATE TABLE prio_objects (
  owner          VARCHAR2(30),
  object_type    VARCHAR2(30),
  object_name    VARCHAR2(30));


Dann erzeugen wir eine Applikationstabelle, die gegen DROP und TRUNCATE geschützt werden soll:

CREATE TABLE scott.gehalts_tab as SELECT * FROM dual;


Diese Tabelle gehalts_tab wird in die Liste der geschützten Objekte aufgenommen:

INSERT INTO prio_objects (owner,object_type,object_name)
  VALUES('SCOTT','TABLE','GEHALTS_TAB');
COMMIT;


Ein DDL Trigger kümmert sich um die Prüfung, welche DROP/TRUNCATE denn abgebrochen werden:

CREATE OR REPLACE TRIGGER system.check_drop
  BEFORE DROP OR TRUNCATE ON DATABASE
BEGIN
  FOR rec in (SELECT * FROM system.prio_objects) LOOP
    IF  sys.dictionary_obj_type=rec.object_type AND 
    sys.dictionary_obj_name=rec.object_name THEN 
     IF sys.dictionary_obj_owner=rec.owner  
     OR sys.dictionary_obj_type ='TABLESPACE' THEN
      RAISE_APPLICATION_ERROR(-20002,'Objekt steht auf Prio-Liste und kann nicht gelöscht werden'); -- Absturz
     END IF;
    END IF;
  END LOOP;
END;
/


Wir testen den DROP und siehe da ...

DROP TABLE scott.gehalts_tab;
DROP TABLE scott.gehalts_tab
*
FEHLER in Zeile 1:
ORA-00604: Fehler auf rekursiver SQL-Ebene 1
ORA-20002: Objekt steht auf Prio-Liste und kann nicht gelöscht werden
ORA-06512: in Zeile 7


Fall 2: Tablespace gegen Löschen schützen:

INSERT INTO system.prio_objects (owner,object_type,object_name)
  VALUES ('SYS','TABLESPACE','CRASH_TBS');
COMMIT;

DROP TABLESPACE crash_tbs;
DROP TABLESPACE crash_tbs
*
FEHLER in Zeile 1:
ORA-00604: Fehler auf rekursiver SQL-Ebene 1
ORA-20002: Objekt steht auf Prio-Liste und kann nicht gelöscht werden
ORA-06512: in Zeile 6


Wenn man ein Objekt nun doch löschen oder leeren möchte, nimmt man es einfach von der Liste in der Tabelle:

DELETE FROM system.prio_objects
  WHERE object_type='TABLESPACE'
    AND object_name='CRASH_TBS';
COMMIT;
DROP TABLESPACE crash_tbs;
TABLESPACE wurde gelöscht.


Beispiel für eine Tabelle:

DELETE FROM system.prio_objects
  WHERE object_type='TABLE'
    AND object_name='GEHALTS_TAB';
COMMIT;
DROP TABLE scott.gehalts_tab;
Tabelle wurde gelöscht.

Sie können natürlich auch das ganze umdrehen und alle Objekte Schützen, bis auf die, die dann in der Tabelle stehen. Das verinfacht die Sache bei vielen Objekten im Schema.
Sie sehen, auch ein DBA braucht hin und wieder mal PL/SQL-Kenntnisse, die er sich gerne in einem unserer fünf verschiedenen PL/SQL-Kurse aneignen kann. :-)

Schutz vor DROP & TRUNCATE auf wichtige Objekte

Besuchen Sie uns doch bei einer unsere über 40 Oracle Schulungen in München - Unterhaching.