Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  1/2007  Pfeil  Datenbanken
suche: 
Dieser Artikel wendet sich an Datenbankadministratoren und Entwickler, die einen Überblick über die Objekttypen von Oracle bekommen möchten.

Reihe Oracle Objekttypen von A - Z (Teil II):

Oracle Objekttypen mit "D"

Im ersten Teil der Reihe haben wir die Objekttypen CLUSTER, CONSUMER GROUP und CONTEXT kennen­gelernt. Heute geht es weiter mit dem Buchstaben „D“: vom Datenbank-Link über Dimensionen bis hin zum Directory.

DATABASE LINK

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!

DIMENSION

Eine Dimension ist ein Metadatenobjekt. Es beschreibt hierarchische Abhängigkeiten zwischen Spalten. Diese Hierarchien nennt Ora­cle 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 ver­wenden.

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 DI­MEN­SION ist aber, dass Oracle diese Aggregationen automatisch erkennt und ein Query Re­write eines einfachen SQL-Befehls für den Anwen­der erledigt.

Den Objekttyp Materialized View werden wir in einer der nächsten Ausgaben vorstellen.

DIRECTORY

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).

CREATE OR REPLACE DIRECTORY 
	datenverzeichnis AS '/oracle/daten';
Abb. 4: Kommando zum Anlegen eines Directories.
GRANT READ ON DIRECTORY 
	datenverzeichnis TO scott;
GRANT WRITE ON DIRECTORY 
	datenverzeichnis TO scott;
Abb. 5: Vergabe von Lese- und Schreibrechten.

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 an­gelegt 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).