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 !