1. Start
  2. Unternehmen
  3. Blog
  4. Heterogene Datenbankintegration I - Oracle

Heterogene Datenbankintegration I - Oracle

Einleitung

Heutzutage werden große Mengen von Daten in Datenbanken abgelegt, sei es die Finanz-, die Lohnbuchhaltung, das Content-Management-System, oder die Personalverwaltung.

Dabei kann es sein, dass die Daten auch zwischen verschiedenen Datenbanken verknüpft oder ausgetauscht werden müssen.

Hierfür gibt es unter Oracle den Datenbank-Link, der den Zugriff auf eine andere Datenbank erlaubt. Allerdings gilt dies in erster Linie nur zwischen Oracle-Datenbanken. Soll ein Zugriff auf ein Fremd-Datenbank-System erfolgen, muss etwas mehr an Konfiguration durchgeführt werden. Die Kommunikation sieht dann in etwa so aus wie auf dem folgenden Bild.

Vorbereitung

Um von einer Oracle-Datenbank auf ein anderes Datenbank-System zugreifen zu können, kann Oracle HS ("Heterogenous Services") genutzt werden. Hierbei wird auf einem Server(in unserem Fall mit Linux als Betriebssystem)  eine ODBC-Verbindung benötigt. Dafür benötigen wir als erstes die ODBC-Software selbst sowie den ODBC-Treiber, der zu dem Datenbank-System passt, auf welches zugegriffen werden soll (in unserem Fall PostgreSQL):

 

$ yum install unixODBC
$ yum install postgresql-15-odbc

 

Unter Windows kann der benötigte Datenbank-Treiber installiert und die Datenquelle mit "ODBC-Datenquellen" komfortabel konfiguriert werden. Der Punkt (2) kann hier ignoriert werden.

 

Konfiguration von ODBC

Für den Zugriff auf PostgreSQL muss unixODBC konfiguriert werden. Als erstes kommt die Treiber-Konfiguration unter /etc/odbcinst.ini dran:

 

[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/pgsql-15/lib/psqlodbca.so
Setup=/usr/lib64/libodbcpsqlS.so
Driver64=/usr/pgsql-15/lib/psqlodbca.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1

 

Danach wird die Datenquelle unter /etc/odbc.ini eingerichtet:

 

[dvdrent]
Description = PostgreSQL dvdrent
Driver = PostgreSQL
Servername = 127.0.0.1
Database = dvdrental
Port = 5432
Trace = yes
TraceFile = /tmp/odbctrace.txt

 

In diesem Beispiel heißt die Datenquelle "dvdrent"; diesen Eintrag benötigen wir später. Ob die ODBC-Verbindung funktioniert, kann mit dem Kommandozeilen-Tool "isql" getestet werden, das auf die Verbindung zugreift:

 

# isql [Verbindungsname] [Benutzername] [Passwort]

Konfiguration von Oracle

Auf Oracle-Seite muss ebenfalls einiges konfiguriert werden. Beginnen wir mit dem Listener. Der Listener kann in der Datei $ORACLE_HOME/network/admin/listener.ora konfiguriert werden. Dazu muss die fremde Datenquelle registriert werden:

 

SID_LIST_LISTENER =
 (SID_LIST =
  (SID_DESC=
   (SID_NAME=dvdrent)                   
   (ORACLE_HOME=/opt/oracle/product/21c/dbhomeXE)
   (PROGRAM=dg4odbc)                   
   (ENVS="LD_LIBRARY_PATH=/usr/lib64:/opt/oracle/product/21c/dbhomeXE/lib")
  )
 )

 

Weiter geht es mit der init.ora. Für die Fremd-Datenquelle wird eine Init-Datei benötigt, in der der Zugriff über den Listener geregelt wird. Diese Datei heißt dann $ORACLE_HOME/hs/admin/init[Datenquellenname].ora und hat folgenden Inhalt:

 

HS_FDS_CONNECT_INFO = dvdrent
HS_FDS_TRACE_LEVEL = ON
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P15
set ODBCINI=/etc

 

Die letzte anzupassende Konfigurationsdatei ist die tnsnames.ora, damit ein Zugriff aus der Datenbank heraus gelingen kann. Folgende Einträge werden benötigt:

 

dvdrent = 
 (DESCRIPTION=
  (ADDRESS=
   (PROTOCOL=tcp)
   (HOST=localhost)
   (PORT=1521)
  )
  (CONNECT_DATA=(SID=dvdrent))
  (HS=OK)
 )

 

Zu guter letzt kann endlich in der Datenbank der Link auf die Fremddatenbank angelegt werden. Dazu melden wir uns in der betreffenden Datenbank an, und erstellen und prüfen den Link wie folgt:

 

SQL> create database link dvdrent connect to "postgres" identified by “P4ssw0rd" using ‘dvdrent’;
SQL> select 1 from dual@dvdrent;
select count(*) from dual@dvdrent
                     *
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
ERROR: relation “DUAL" does not exist;
No query has been executed with that handle {42P01,NativeErr = 1}
ORA-02063: preceding 3 lines from DVDRENT

 

Allerdings existiert "DUAL" nicht in der Fremd-Datenbank. Deswegen testen wir noch einmal mit einer existierenden Tabelle oder View:

 

SQL> select first_name,last_name from actor@dvdrent;
select first_name,last_name from actor@dvdrent
                  *
ERROR at line 1:
ORA-00904: "LAST_NAME": invalid identifier

 

Wir wissen dass die Tabelle existiert, allerdings ist diese nicht wie unter Oracle üblich groß-, sondern kleingeschrieben. Wir müssen also gezielter abfragen:

 

SQL> select "first_name","last_name" from "actor"@dvdrent;

first_name
--------------------------------------------------------------------------------
last_name
--------------------------------------------------------------------------------
Penelope
Guiness

 

Na also!

Abschluss

Hier in unserem Beispiel haben wir für die PostgreSQL-Datenbank den Standard-User "postgres" genutzt. In Datenbanken mit schützenswerten Daten sollte ein Benutzer gewählt werden, der zwar auf alle benötigten Inhalte zugreifen darf, aber nicht zu viele Rechte hat.

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich