APEX-Anwendungen auf Linux "mounten": Mit dem Oracle 11gR2 Database Filesystem

Oracle11g Release 2 steht seit dem 1. September zum Download bereit. In diesem Tipp stellen wir Ihnen eine völlig neue Möglichkeit vor, Bilder, Dokumente oder andere Dateien in eine APEX-Applikation hochladen zu können - das neue Datenbank Filesystem in Oracle 11g Release 2. Lesen Sie hier, wie Sie ein Datenbank-Filesystem einrichten, auf einem Linux-System in den Verzeichnisbaum einhängen, mit normalen Linux-Kommandos Dateien dort hineinkopieren und schließlich aus einer APEX-Anwendung heraus damit arbeiten können. Voraussetzung für diesen Tipp ist eine Installation von Oracle 11g Release 2.

Vorbereitungen

In einer Datenbank können mehrere Dateisysteme existieren. Zu jedem Datenbank-Filesystem gehört eine Tabelle, in welche die Dateien abgelegt werden. Die Tabelle kann in jedem beliebigen Datenbankschema (also auch im Parsing Schema einer APEX-Anwendung) liegen. Das Datenbankschema benötigt allerdings die Rolle dbfs_role. Führen Sie also die ersten Schritte in SQL*Plus durch:

  • Geben Sie Ihrem APEX Parsing Schema (hier: DBFS) die Rolle DBFS_ROLE - dies müssen Sie als DBA tun.
  • Navigieren Sie (auf dem Datenbankserver) ins Verzeichnis $ORACLE_HOME/rdbms/admin und starten Sie dort das SQL-Skript dbfs_create_filesystem_advanced.sql. Dies kann wie folgt aufgerufen werden:
    SQL> @ dbfs_create_filesystem_advanced.sql
              [tablespace_name]
              [filesystem_name]
              [compress-high | compress-medium  | nocompress]
              [deduplicate | nodeduplicate] 
              [encrypt | noencrypt]
              [non-partition | partition | partition-by-itemname | partition-by-guid, partition-by-path]
    
    Der folgende Aufruf erzeugt ein Dateisytem namens APEX_FS, legt die Tabelle in den Tablespace USERS und verwendet keinerlei Performance-, Kompressions- oder Sicherheitsfeatures. Diese können aktiviert werden, erfordern jedoch die Lizensierung zusätzlicher Datenbankoptionen wie der Advanced Security Option, der Advanced Compression Option oder der Partitioning Option:
    SQL> @dbfs_create_filesystem_advanced.sql USERS APEX_FS nocompress nodeduplicate noencrypt non-partition
    

Nachdem das Skript durchgelaufen ist, befindet sich die Tabelle T_APEX_FS in Ihrem Datenbankschema - Abbildung 1 zeigt die Sicht der Tabelle im SQL Workshop. In dieser Tabelle werden alle Dateien gespeichert. Die Inhalte selbst befinden sich als BLOB in der Spalte FILEDATA, der Dateiname ist in der Spalte ITEM.

Die Basistabelle "T_APEX_FS" für das neue Datenbank-Filesystem im SQL Workshop

Abbildung 1: Die Basistabelle "T_APEX_FS" für das neue Datenbank-Filesystem im SQL Workshop

Bevor Sie nun eine APEX-Anwendung für diese Tabelle erstellen, wollen wir uns der Möglichkeit widmen, das Datenbank Filesystem in den Verzeichnisbaum eines Linux-Servers einhängen zu können - das ist das zentrale neue Feature des Datenbank Filesystems.

Einhängen in den Linux-Verzeichnisbaum (mount)

Bevor Sie das soeben erzeugte Dateisystem in den Verzeichnisbaum Ihres Linux-Servers einhängen können, müssen einige Vorbereitungen getroffen werden. Dazu ist auch die Hilfe des Systemadministrators (root) nötig. Die Schritte sind im einzelnen in der Oracle-Dokumentation (SecureFiles and Large Objects Developers' Guide) beschrieben:

  • Das Paket "fuse" (FileSystem in Userspace) muss installiert werden. Achten Sie darauf, dass Sie exakt die Version 2.7.3 von fuse.sourceforge.net herunterladen und installieren.
  • Stellen Sie sicher, dass das Fuse-Kernelmodul mod_fuse bei jedem Systemstart mit modprobe fuse geladen wird.
  • Stellen Sie sicher, dass der Linux-User oracle auf die Device-Datei /dev/fuse zugreifen kann (chmod 666 /dev/fuse). Auch dies muss bei jedem Systemstart gesetzt werden.

Anschließend ist das System eingerichtet: Nun kann das erzeugte Dateisystem in den Verzeichnisbaum eingehängt werden. Legen Sie zunächst ein leeres Verzeichnis als Mount Point an. Das Verzeichnis muss dem Eigentümer der Oracle-Software gehören (typischerweise oracle).

$ mkdir /oracle/dbfs

$ ls -lad /oracle/dbfs
drwxr-xr-x  2 oracle oinstall 4096 21. Sep 11:07 /oracle/dbfs

Mit dem von Oracle mitgelieferten Executable dbfs_client (im Verzeichnis $ORACLE_HOME/bin) wird das Datenbank Filesystem nun eingehängt. Der Aufruf ist wie folgt:

Usage: dbfs_client [db_user]@[db_server] [options] [mount point]

Die Parameter im einzelnen ...

  • db_user: Name des Datenbankusers, dem die Tabellen des Datenbank-Filesystems gehören
  • db_server: Ein gültiger Connection-String zu einer Oracle-Datenbank (Release 11.2). Der Connection String sollte vorher mit SQL*Plus oder einem anderen Werkzeug getestet werden. Die Datenbank muss sich aber nicht auf dem gleichen Rechner befinden.
  • mount point: Das Verzeichnis, in welches das Dateisystem eingehängt werden soll. Alle Dateisysteme des angegebenen Datenbankschemas (können auch mehrere sein) werden dort sichtbar sein.
  • options: Zusätzliche Optionen für den Mount sind in der Oracle-Dokumentation beschrieben.

Ein denkbarer Aufruf wäre also wie folgt:

$ dbfs_client DBFS@localhost:1521/orcl -o rw /oracle/dbfs

Das Programm fragt Sie nach dem Passwort des Datenbankusers (hier: DBFS). Anschließend ist ist das Datenbank Filesystem eingehängt - das Executable läuft übrigens solange das Dateisystem eingehängt ist - wundern Sie sich nicht, wenn der Prompt nicht "zurückkommt". Kopieren Sie nun (mit normalen Linux-Mitteln) einige Dateien hinein. Abbildung 2 zeigt die Sicht auf das Dateisystem nach dem Kopieren der Dateien.

Dateisystem-Sicht auf die Inhalte des neuen Datenbank-Filesystems

Abbildung 2: Dateisystem-Sicht auf die Inhalte des neuen Datenbank-Filesystems

Der Clou ist nun die SQL-Sicht auf die Dateien: Denn alle Dateien liegen in der Tabelle T_APEX_FS. Diese können Sie sich bereits im SQL Workshop ansehen (Abbildung 3).

SQL-Sicht auf die Inhalte des neuen Datenbank-Filesystems

Abbildung 3: SQL-Sicht auf die Inhalte des neuen Datenbank-Filesystems

Wenn Sie nun per SQL-Kommando Dateien löschen, verschwinden diese selbstverständlich auch in der Betriebssystem-Sicht. Alle Daten liegen in der Tabelle T_APEX_FS; mit dem Einhängen in den Linux-Verzeichnisbaum steht jedoch eine zusätzliche Schnittstelle auf die Daten zur Verfügung. Nimmt man das auf Linux-Systemen ebenfalls sehr verbreitete Paket Samba hinzu, so kann das neue Datenbank-Filesystem auch als Windows-Share im Netzwerk publiziert werden. Windows-Rechner können es dann als Netzlaufwerk einbinden (Abbildung 4).

Das Datenbank-Filesystem als Windows-Share (via Samba)

Abbildung 4: Das Datenbank-Filesystem als Windows-Share (via Samba)

Integration in eine APEX-Anwendung

Nun geht es daran, eine APEX-Sicht auf das Dateisystem zu erzeugen (in diesem Tipp erstmal nur "Read Only") - und auch dies ist sehr einfach. Erzeugen Sie eine neue APEX-Anwendung und darin eine neue, leere Seite. Fügen Sie dieser Seite als erstes einen Baum (Tree) zur Darstellung der Ordner-Struktur hinzu.

  • Klicken Sie in der Developer Toolbar unterhalb der Seite auf Erstellen (Create)
  • Wählen Sie Neue Seite (New page) aus
  • Wählen Sie dann Baum (Tree) aus.
  • Machen Sie zunächst Angaben zur Seitennummer, zum Seiten- und Regionstitel und zu den verwendeten Templates.
    Erstellung des Ordner-Baums: Page Attributes

  • Geben Sie dem Baum einen (internen) Namen. Wichtig ist die Einstellung zur Wurzel des Baums (Start Tree). Diese muss auf einer SQL-Abfrage basieren (Based on a SQL Query).
    Erstellung des Ordner-Baums: Tree Attributes

  • Wählen Sie ein Darstellungstemplate aus.
    Erstellung des Ordner-Baums: Tree Template

  • Geben Sie die SQL-Abfrage an, welche die Wurzel des Baums bestimmt. Die Wurzel des Dateisystems enthält den Text ROOT in der Spalte ITEM. Die Ordner-Hierarchie wird durch die Einträge in den Spalten STD_GUID und STD_PARENT_GUID bestimmt.
    Erstellung des Ordner-Baums: Tree Start

  • Fügen Sie Schaltflächen zum Auf- oder Zusammenklappen der Baumknoten nach Belieben hinzu.
    Erstellung des Ordner-Baums: Expand / Collapse

  • Wählen Sie das Datenbankschema aus, in dem sich die Dateisystem-Tabelle befindet (hier: DBFS).
    Erstellung des Ordner-Baums: Table / View Owner

  • Geben Sie die Dateisystem-Tabelle an (hier: T_APEX_FS).
    Erstellung des Ordner-Baums: Table / View Name

  • Legen Sie fest, welche Spalten die Hierarchie des Dateisystems bestimmen (STD_GUID und STD_PARENT_GUID) und welche Spalten im Baum angezeigt werden sollen (ITEM). Wählen Sie Existing Application Item bei Link Option aus.
    Erstellung des Ordner-Baums: Query

  • Legen Sie Details zum Link fest. Der Link soll auf die gleiche Seite (Page 1) verzweigen und das Element P1_FOLDER_GUID mit einem Wert setzen. Das Element muss noch nicht existieren, wir legen es nach Erstellen des Baums an. Tragen Sie es hier dennoch ein.
    Erstellung des Ordner-Baums: Link

  • Legen Sie noch eine zusätzliche WHERE-Klausel fest. Im Baum sollen nur Ordner angezeigt werden. In der Tabelle T_APEX_FS lassen diese sich anhand der Spalte PATHTYPE identifizieren. Der Wert 2 repräsentiert einen Ordner. Tragen Sie also PATHTYPE = 2 als Where-Klausel ein.
    Erstellung des Ordner-Baums: Where Clause

Starten Sie Ihre Anwendungsseite schließlich. Diese sollte dann wie in Abbildung 5 aussehen.

APEX Tree mit den Ordnern des Datenbank Filesystems

Abbildung 5: APEX Tree mit den Ordnern des Datenbank Filesystems

Erzeugen Sie nun (in der Baum-Region) das bereits verwendete Element P1_FOLDER_GUID als ausgeblendetes Element (Hidden). Erzeugen Sie als nächstes einen neuen Bericht. Verwenden Sie dabei folgendes SQL als Berichtsabfrage:

select
  item,
  std_guid,
  apex_util.filesize_mask(dbms_lob.getlength(filedata)) file_size,
  dbms_lob.getlength(filedata) download,
  std_change_time
from t_apex_fs
where std_parent_guid = :P1_FOLDER_GUID
and pathtype = 1

Navigieren Sie anschließend zu den Berichtsattributen und vergeben Sie dort passende Spaltenüberschriften. Die Spalte STD_GUID können Sie ausblenden (Hidden). Eine Besonderheit ist die Spalte Download - navigieren Sie zu den Spaltenattributen derselben und hinterlegen Sie folgendes Zahlen bzw. Datumsformat (Number / Date Format):

DOWNLOAD:T_APEX_FS:FILEDATA:STD_GUID:::ITEM:STD_CHANGE_TIME::inline:Download
Spezielles Format für die Spalte DOWNLOAD

Abbildung 6: Spezielles Format für die Spalte DOWNLOAD

Mit diesem speziellen Formatstring wird APEX im Bericht einen Download-Link für diese Datei generieren. Abbildung 7 zeigt den dann fertigen Bericht im Zusammenspiel mit dem Baum für die Folderstruktur.

Fertige APEX-Seite für das Datenbank-Filesystem

Abbildung 7: Fertige APEX-Seite für das Datenbank-Filesystem

Ausblick

Wenn Sie in Ihrer APEX-Anwendung mit Dateien (Bilder, Dokumente und andere) arbeiten, so kann das in Oracle11g Release 2 neue Datenbank Filesystem eine interessante neue Möglichkeit sein, Dateien in die Datenbank zu schreiben. Auf Linux-Systemen kann das Datenbank Filesystem in den Verzeichnisbaum eingehängt werden (mount) - anschließend kann es mit normalen Betriebssystem-Kommandos genutzt werden. Alle Inhalte befinden sich jedoch in einer Datenbanktabelle, die mit SQL-Abfragen angesprochen und damit in APEX-Anwendungen integriert werden kann. Alle Möglichkeiten der Oracle-Datenbank stehen für die Inhalte des Datenbank Filesystems bereit:

  • Einheitliches Backup & Recovery
  • Integrität von Daten und Metadaten mit Constraints
  • Abfragen von Datenständen "in der Vergangenheit" mit Flashback Query (Community-Tipp)
  • Volltextindizerung und Recherche im Dateisystem mit Oracle TEXT (Community-Tipp)
  • Und vieles mehr ...

Bis hierhin wurde das Datenbank Filesystems aus APEX heraus lediglich "Read Only " genutzt - die Dateien wurden über Betriebssystem-Kommandos (Linux-Mount) geschrieben. Die Architektur der Datenbank-Filesysteme erlaubt darüber hinaus auch schreibende Zugriffe aus der SQL-Ebene heraus und sogar Dateisysteme für eigene Tabellen und eigene Datenstrukturen. Diese Themen müssen jedoch einem separaten Community-Tipp vorbehalten bleiben ...

Zurück zur Community-Seite