
Weiterführende Links
Ein Datenbank-Link (DB-Link) ermöglicht den Zugriff aus einer Datenbank heraus über Oracle Net auf eine beliebige, andere Datenbank.
Zunächst wird in unserem Beispiel ein DB-Link "ordix" angelegt (siehe Abbildung 1). Anschließend kann der Zugriff auf die entfernte Datenbank einfach mit dem Suffix "@ordix" hinter dem Tabellennamen im SQL-Befehl erfolgen. Auf der Zieldatenbank bezieht sich alles auf das Schema, das in der Connect-Klausel angegeben ist – hier scott.
CREATE [PUBLIC] DATABASE LINK ordix CONNECT TO scott IDENTIFIED BY tiger USING 'james'; |
| Abb. 1: Kommando zum Anlegen eines DB-Links. |
Wichtig für die korrekte Auflösung des DB-Links ist die Konfigurationsdatei tnsnames.ora auf dem Datenbankserver, auf dem der DB-Link angelegt wurde. Diese Datei muss einen entsprechenden Eintrag für den TNS-Connect-String james beinhalten, welcher auf die Zieldatenbank verweist (siehe Abbildung 2).
james =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = lebaron)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = bond))
) |
| Abb. 2: Eintrag des TNS-Connect-Strings james in der tnsnames.ora. |
Oracle unterscheidet öffentliche (public) DB-Links, die für alle bekannt sind, und private DB-Links, welche nur für den Ersteller sichtbar sind. In der Syntax sorgt das Schlüsselwort PUBLIC für den Typ. Wird die Connect-Klausel nicht mit angegeben, so wird auf der Zieldatenbank ein Schema gleichen Namens wie auf der Ursprungsdatenbank angenommen.
Das eigentlich Interessante am DB-Link ist, dass mit ihm ein transparenter Zugriff auf mehrere Datenbanken gleichzeitig möglich wird. Dies ist eine so genannte "verteilte Datenbank". Damit können innerhalb einer Transaktion auf mehreren Datenbanken Änderungen vorgenommen werden. Mit dem Befehl commit werden diese auf allen Systemen aktiv.
Kommt es zu einem Fehler auf einem System, werden die Änderungen auf allen Systemen zurückgerollt. Kann ein System nicht erreicht werden, werden alle Änderungen angehalten.
Diese Änderungen müssen dann vom Systemadministrator per commit manuell bestätigt oder zurückgerollt werden. Der Befehl commit wird implizit mit dem Protokoll "Two Phase Commit" behandelt.
Achtung: Bis einschließlich zur Version 10g Release 1 werden die Passwörter von DB-Links unverschlüsselt im Data Dictionary in den Views user_links und link$ dargestellt, d. h. sie sind sichtbar!
Eine Dimension ist ein Metadatenobjekt. Es beschreibt hierarchische Abhängigkeiten zwischen Spalten. Diese Hierarchien nennt Oracle Dimensionen. Eine Anwendung, wie im Folgenden kurz erläutert, findet sich typischerweise in Data Warehouse Projekten.
Beispiel: Eine häufig verwendete Dimension ist die Zeit. Sie besteht beispielsweise aus Tagen und den Aggregationen Monate und Jahre. Mit Hilfe einer Referenztabelle lässt sich zu jedem Tag jede der entsprechenden Aggregationen zuordnen. Diese Referenztabelle zeit_ref hätte dann folgende Spalten:
Die Spalte tag stellt den Primary Key der Tabelle dar. Die Tabelle muss von der Anwendung gepflegt werden und enthält für jeden relevanten Tag den Monat und das Jahr. Die Referenztabelle kann mit einer Basistabelle, z. B. Verkäufe, nach Belieben verknüpft werden. Oracle kennt aber – bisher – keinen eigenständigen Mechanismus, um die Abhängigkeiten der Aggregationen zu beschreiben, darzustellen oder in Ausführungsplänen zu verwenden.
An dieser Stelle setzt die Dimension an. Für das oben genannte Beispiel kann der Anwendungsentwickler jetzt eine Dimension erstellen (siehe Abbildung 3).
CREATE DIMENSION ZEIT_HIERARCHIE
level tag is zeit_ref.tag
level monat is zeit_ref.monat
level jahr is zeit_ref.jahr
hierarchy ZEIT_ROLLUP
( tag child of
monat child of
jahr
);
|
| Abb. 3: Erstellung einer Dimension. |
Wird jetzt zusätzlich eine Materialized View auf die Verkaufstabelle auf dem Aggregat monat angelegt, so kann der Optimizer mit Hilfe der Hierarchie und der Referenztabelle auch Ergebnisse für Jahre aggregieren. Dies bedeutet letztendlich, dass für eine Vielzahl von Auswertungen von Basistabellen nach verschiedenen Dimensionen und unterschiedlichen Aggregationen nur einige wenige Materialized Views benötigt werden.
Natürlich können mit Hilfe gut formulierter SQL-Befehle diese Aggregationen ebenfalls vorgenommen werden. Der Clou beim Thema DIMENSION ist aber, dass Oracle diese Aggregationen automatisch erkennt und ein Query Rewrite eines einfachen SQL-Befehls für den Anwender erledigt.
Den Objekttyp Materialized View werden wir in einer der nächsten Ausgaben vorstellen.
Bis zur Version 8 konnte man ausschließlich auf Verzeichnisse zugreifen, die über den Initialisierungsparameter utl_file_dir konfiguriert waren. Der Zugriff war dann grundsätzlich lesend und schreibend möglich. Der Objekttyp DIRECTORY ermöglicht einen deutlich besseren Zugriffsschutz.
Nach dem Anlegen eines Directories (siehe Abbildung 4) kann das Recht für den lesenden und schreibenden Zugriff differenziert erteilt werden (siehe Abbildung 5).
|
||
|
Dies setzt allerdings voraus, dass das Verzeichnis (hier /oracle/daten) existiert und der Betriebssystembenutzer, unter dem die Datenbank läuft, Lese- und Schreibberechtigung auf dem Verzeichnis besitzt. Unterverzeichnisse können in einem Directory nicht angelegt werden.
Das in Abbildung 4 benannte Directory kann nun mit verschiedenen Werkzeugen und Methoden unter Verwendung seines logischen Namens – hier datenverzeichnis – verwendet werden. Hierzu zählen beispielsweise:
Liegt in diesem Directory beispielsweise die Datei geheim.dat, so kann, wie in Abbildung 6 gezeigt, über eine externe Tabelle darauf zugegriffen werden.
CREATE TABLE geheim ( geheimnis VARCHAR2(100))
ORGANIZATION EXTERNAL
( TYPE oracle_loader
DEFAULT DIRECTORY datenverzeichnis
LOCATION ('geheim.dat')
)
REJECT LIMIT UNLIMITED;
|
| Abb. 6: Zugriff auf eine Datei im zuvor angelegten Directory mit Hilfe einer externen Tabelle. |
Für den Aufruf externer Programme aus dem Paket dbms_schedule verwendet Oracle den Objekttyp DIRECTORY zur Referenzierung der Programmverzeichnisse leider nicht. Sehr konsequent wird dagegen die zugehörige View dba_directories im korrekt geschriebenen Plural verwendet.
In der nächsten Ausgabe setzen wir die Reihe Oracle Objekttypen von A - Z mit "E" wie Evaluation Context fort.
Martin Hoermann (info@ordix.de).