Auswahl  

 

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

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 !