Auswahl  

 

Oracle
PL/SQL
RDBMS 11.2:RDBMS 12.2
29.06.18 (MP)
11.12.18 (MP)
PL/SQL

Body

Bereits seit der Version 10.1 kann man mit einer (undokumentierten) Funktion den Inhalt von Betriebssystemordnern auslesen. Diese Prozedur wird vom RMAN bei folgendem Befehl verwendet:

RMAN> CATALOG START WITH c:\temp;

Hier werden alle Dateien des Ordners c:\temp und auch der Unterordner gelesen und geprüft, ob es sich um eine Oracle-Datei handelt.

Die folgende PL/SQL-Prozedur liest nur den Inhalt des Ordners c:\temp aus:

SET SERVEROUTPUT ON
DECLARE
   ns    VARCHAR2(1024);
   v_dir VARCHAR2(1024):='c:\temp';
BEGIN
   DBMS_BACKUP_RESTORE.SEARCHFILES(v_dir, ns);
   FOR r IN (SELECT fname_krbmsft as name FROM x$krbmsft) LOOP
      DBMS_OUTPUT.PUT_LINE(r.name);
   END LOOP;
END;
/

Ergibt z. B. die Ausgabe:

C:\Temp\dozent2_tuning.txt
C:\Temp\perl_test.pl
C:\Temp\Muniqsoft_Backup.7z

Leider darf nur der Benutzer SYS dieses Package ausführen. Wenn auch ein anderer Benutzer in den Genuss dieser Prozedur kommen soll, stehen zwei Varianten zur Verfügung:

1. VARIANTE: DER BENUTZER BEKOMMT EIN AUSFÜHRUNGSRECHT AN DIESEM PACKAGE.


Der Nachteil dieser Variante ist, dass dieses Package zwar viele interessante aber auch gefährliche Nutzungsmöglichkeiten bietet.

GRANT EXECUTE ON DBMS_BACKUP_RESTORE TO SYSTEM;

Danach muss (im Schema SYS!) eine View auf die fixed table x$krbmsft erstellt werden (Selectrechte an Fixed Tables können nicht direkt vergeben werden):

CREATE VIEW sys.x$krbmsft_muso_view AS SELECT * FROM sys.x$krbmsft;

Der User SYSTEM bekommt das Select-Recht auf diese View:

GRANT SELECT ON sys.x$krbmsft_muso_view TO SYSTEM;

Jetzt kann man sich als SYSTEM anmelden und schreibt die Prozedur etwas um:

SET SERVEROUTPUT ON
DECLARE
    ns   VARCHAR2(1024);
   v_dir VARCHAR2(1024):= 'c:\temp';
BEGIN
   SYS.DBMS_BACKUP_RESTORE.SEARCHFILES(v_dir, ns);
   FOR r IN (SELECT fname_krbmsft as name FROM sys.x$krbmsft_muso_view) LOOP
     DBMS_OUTPUT.PUT_LINE(r.name);
   END LOOP;
END;
/


2. VARIANTE: WIR SCHREIBEN EINEN WRAPPER UM DEN PACKAGE-AUFRUF, DER UNS NUR ERMÖGLICHT, DIESE EINE PROZEDUR DES PACKAGES ZU NUTZEN


CREATE OR REPLACE PROCEDURE sys.muso_backup_restore_sfiles(
     v_dir IN OUT VARCHAR2,
     ns       OUT VARCHAR2)
IS
BEGIN
   DBMS_BACKUP_RESTORE.SEARCHFILES(v_dir, ns);
END;
/

Dann vergeben wir nur ein Ausführungsrecht an der Prozedur (nicht mehr am kompletten Package!):

GRANT EXECUTE ON sys.muso_backup_restore_sfiles TO SYSTEM;
REVOKE EXECUTE ON DBMS_BACKUP_RESTORE FROM SYSTEM;

 

connect system/sys
SET SERVEROUTPUT ON
DECLARE
      ns VARCHAR2(1024);
   v_dir VARCHAR2(1024):='c:\temp';
BEGIN
   sys.muso_backup_restore_sfiles(v_dir, ns);
   FOR r IN ( SELECT fname_krbmsft as name FROM sys.x$krbmsft_muso_view) LOOP
       DBMS_OUTPUT.PUT_LINE(r.name);
   END LOOP;
END;
/


Diese Prozedur bietet viele Einsatzmöglichkeiten, z. B.:

  • Ein komplettes Verzeichnis (mit Bildern, PDF's oder Word Dokumenten) in BLOB Feldern speichern...
  • Ordner per FTP in die (in jeder Oracle-Version vorhanden) XML-Datenbank hochladen.
  • Prüfen, ob neue Dateien in einem Betriebssystem-Ordner vorhanden sind, und diese mit utl_file oder External Table einlesen.


Diese und weitere Beispiele lernen Sie u. a. in unserem PL/SQL II oder Reorg und Wartungskurs.
Besuchen Sie uns doch mal, wir freuen uns auf Sie !

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