MuM SupportPlus News 04/2017 Tipps & Tricks GIS und Infrastruktur ODBC-Verbindungen in Oracle-Datenbanken nutzen Bereits in der Vergangenheit haben wir verschiedene Möglichkeiten beschrieben, wie sich Daten aus externen Quellen in AutoCAD Map über die ODBC-Verbindung nutzen lassen. In diesem Beispiel wollen wir Ihnen zeigen, wie Sie die Tabellen einer Access-Datenbankanwendung in Oracle für die Visualisierung von Geodaten verwenden können. Dabei steht Access synonym für alle relationalen Datenbanken (z.B. MS SQL Server, MySQL), die über eine ODBC-Verbindung erreichbar sind. Im Anschluss daran können Sie von Oracle aus über die ODBC-Verbindung SQL-Abfragen ausführen, aber auch Datensätze hinzufügen und modifizieren. Folgende Schritte sind ausschließlich auf dem Datenbankserver erforderlich, um eine Verbindung zu einer ODBC-Datenquelle herzustellen: 1. 2. 3. 4. 5. 6. ODBC-DSN erstellen Oracle-Initialisierungsdatei erstellen Listener erstellen TNS-Name erstellen Database-Link erstellen Synonyme oder Views erstellen Voraussetzung für einen erfolgreichen Zugriff auf die Access-Datenbank, bzw. andere Datenbank, ist ein Treiber, der in der ODBC-Administration von Windows einen Provider hinzufügt, über den sich die externe Datenbank ansprechen lässt. Für alle gängigen Datenbanken lassen sich in der Regel Provider im Internet zum Download finden. Im Falle der Access-Datenbank können Sie die Access Database Engine für Office 2010 x64 nutzen. ODBC-DSN erstellen Starten Sie auf dem Datenbank-Server den ODBC-Administrator (C:\Windows\System32\odbcad32.exe) und wechseln in die Registerkarte System-DSN. Klicken Sie auf die Schaltfläche Hinzufügen, wählen aus dem nachfolgenden Dialog den gewünschten Provider aus und klicken auf Fertigstellen. 1 MuM SupportPlus News 04/2017 Tipps & Tricks GIS und Infrastruktur Es erscheint der Konfigurationsdialog der ODBCVerbindung. Dieser Dialog unterscheidet sich je nach verwendeter Datenbank. Bei einer Microsoft AccessDatenbank klicken Sie auf die Schaltfläche Auswählen, um die Datenbankdatei zu wählen. Diese sollte auf einem Festplattenlaufwerk des OracleDatenbankservers liegen. Tests, die Datei von einem Netzlaufwerk von Oracle aus anzusprechen, waren nicht erfolgreich. Klicken Sie auf die Schaltfläche Erweitert, um Zum Abschluss vergeben Sie noch einen kurzen, aber ggf. einen Anmeldenamen und ein Passwort prägnanten Namen für die Datenquelle. Beenden Sie für den Zugriff auf die Datenbank einzugeben. den Dialog mit OK. Oracle-Initialisierungsdatei erstellen Als nächstes melden Sie die ODBC-Datenquelle im Oracle an. Dazu muss beim Start des ListenerDienstes im $ORACLE_HOME/hs/admin eine Initialisierungsdatei gefunden werden, die den Namen der ODBC-Datenquelle enthält. 2 MuM SupportPlus News 04/2017 Tipps & Tricks GIS und Infrastruktur Dazu erstellen Sie eine Kopie der Datei initdg4odbc.ora und benennen sie so um, dass sie mit init beginnt und der Datenquellenname folgt. Anschließend öffnen Sie die Datei in einem Editor und tragen hinter HS_FDS_CONNECT_INFO den Namen der System-DSN oder aber die vollständige DSN-Information ein. Hinter HS_DB_NAME fügen Sie den Namen der Datenbank ein, wie sie innerhalb der Oracle-Umgebung erkannt werden soll. Bitte beachten Sie, dass dieser Name maximal 8 Zeichen lang sein darf. Schreiben Sie idealerweise den DB_NAME und den DSN-Namen in Großbuchstaben. Speichern und schließen Sie die Datei. Listener erstellen Öffnen Sie im Verzeichnis $ORACLE_HOME/network/admin die listener.ora in einem Editor und fügen Sie in der Liste der Listener einen weiteren Eintrag hinzu. Speichern und schließen Sie anschließend die Datei. Die Liste der Listener könnte also so aussehen: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = C:\app\oracle\product\12.1.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle\product\12.1.0\dbhome_1\bin\oraclr12.dll") ) (SID_DESC = (SID_NAME = GF_WI_MDB) (ORACLE_HOME = C:\app\oracle\product\12.1.0\dbhome_1) (PROGRAM = dg4odbc) ) ) Um die Änderungen wirksam werden zu lassen, werden wir später den Listener neustarten. TNS-Name erstellen Mit der Änderung in der Listener-Liste kann die Datenbank nun die Anfrage an die ODBC-Datenbank entgegennehmen. Damit Sie jedoch auch eine Anfrage an die ODBC-Datenbank senden können, muss die Liste der TNS-Namen um den entsprechenden Eintrag erweitert werden. Öffnen Sie also im im selben Verzeichnis $ORACLE_HOME/network/admin die tnsnames.ora in einem Editor und fügen Sie einen weiteren Eintrag hinzu. Speichern und schließen Sie die Datei. GF_WI_MDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = GISSERVER)(PORT = 1521)) 3 MuM SupportPlus News 04/2017 Tipps & Tricks GIS und Infrastruktur (CONNECT_DATA = (SID = GF_WI_MDB) ) (HS = OK) ) Database-Link erstellen Starten Sie die MS-DOS-Eingabeaufforderung mit administrativen Privilegien und geben Sie nacheinander die Befehle lsnrctl stop und lsnrctl start ein, um den Listener neu zu starten. In der Rückmeldung erkennen Sie bereits die zusätzliche Verbindung zur ODBC-Datenbank. Melden Sie sich nun an der Datenbank an und erstellen testweise einen öffentlichen Datenbanklink, um die Funktionalität zu überprüfen. Syntax: create public database link <db_name> connect to <odbc_user> identified by <odbc_pass> using <tns_name>; Beispiel: create public database link GF_WI_LNK connect to Administrator identified by admin using 'GF_WI_MBD'; Test: select * from dual@GF_WI_LNK; Benutzername und Passwort müssen mit den Zugangsdaten übereinstimmen, die Sie in den erweiterten Einstellungen in der ODBC-Administration eingetraten haben. Haben Sie in der AccessDatenbank hingegen keinen Benutzernamen und Passwort vergeben und die Anmeldedaten in den erweiterten Einstellungen der ODBC-Verbindung bleiben leer, dann können Sie bei der Erstellung des Database Links beliebige Zugangsdaten eintragen. 4 MuM SupportPlus News 04/2017 Tipps & Tricks GIS und Infrastruktur Jetzt können Sie auch Datensätze manipulieren. Achten Sie auch hier darauf, dass die Transaktion mit COMMIT abgeschlossen werden muss, um die Änderungen anzuwenden. Allerdings sollten Sie sich überlegen, ob die Datenbankverbindung wirklich PUBLIC, also für jedermann lesend wie schreibend zur Verfügung stehen soll. Das ist aber abhängig von der jeweiligen Situation und der zugrundeliegenden Aufgabenstellung. Soll beispielsweise lediglich eine Tabelle für den lesenden Zugriff referenziert werden, erstellen Sie in einem eigenen User eine View auf die ODBC-Tabelle und vergeben eine GRANT SELECT-Berechtigung an die berechtigten Fachschalen. Im abschließenden Beispiel wollen wir demonstrieren, wie Sie für alle Tabellen der ODBCDatenquelle automatisiert Views erstellen, und diese in einer Fachschale anwenden. -- Liest alle Tabellen der Access-Datenbank aus select table_name from user_tables@gf_wi_lnk where table_name not like 'MSys%' and not table_name in ('tmp') order by table_name; -- Erzeugt eine Liste von SQL-Statements, um Views für den Zugriff auf die ODBC-Tabellen select 'create or replace view '||upper(table_name)||' as select * from '||upper(table_name)||'@gf_wi_lnk;' as text from user_tables@gf_wi_lnk where table_name not like 'MSys%' and not table_name in ('tmp') order by table_name; 5 MuM SupportPlus News 04/2017 Tipps & Tricks GIS und Infrastruktur Bitte beachten Sie dabei, dass Sonderzeichen in den Namen von Tabellen, Ansichten und Feldbezeichnern in Oracle problematisch sind. Benennen Sie diese in der Accessdatenbank ggf. um. Feldbezeichner können Sie auch innerhalb von Oracle überschreiben. -- Überschreibt die Feldbezeichner einer Tabelle CREATE OR REPLACE VIEW T_ART AS select "Art" ART,"Art_lang" ART_LANG from T_ART@gf_wi_lnk; Dann können Sie die Werte in Ansichten verknüpfen oder auch Referenzen aus der ODBCDatenquelle in der Fachschale speichern. 6