Fortuna Entwickler Blog

Hier wird Ihnen geholfen

Oracle als Linked Server in SQL Server eintragen

Um aus einem SQL Server heraus auf eine Oracle Datenbank zuzugreifen benötigt man auf dem SQL Server Rechner ein paar Einstellungen / Programme:

1: \\VCENTER2\Entwickler-Tools\Datenbank\Oracle\ODAC1120320_x64.zip entpacken und setup.exe ausführen

(bei 32bit Systemen verwendet man ODAC1120320Xcopy_32bit.zip im gleichen Verzeichnis)

2: Durch die Installation einfach durchklicken und Standard installieren

3: Im SQL Server Manager gibt es nun unter Serverobjekte -> Verbindungsserver -> Anbieter einen Eintrag OraOLEDB.Oracle. Bei diesem Eintrag in den Eigenschaften muss die Option In Process zulassen gesetzt werden.

4: tsnames.ora und sqlnet.ora anpassen. Beispiele:

sqlnet.ora:

# SQLNET.ORA Network Configuration File: C:\ora92\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
NAMES.DEFAULT_DOMAIN = gutingia.local
SQLNET.AUTHENTICATION_SERVICES= (NONE)
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME)

tsnames.ora:

DBWEB1.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DBWEB1)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DBWEB1)))

DBWEBTESTDMZ1.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DBWEBTESTDMZ1)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DBWEBTESTDMZ1)))

DBWEBENTW3.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DBWEBENTW3)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DBWEBENTW3)))

DBPROD1.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DBPROD1)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DBPROD1)))

TWDB.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = TWDB)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = ventaDB)))

5: einen Linked Server erstellen und Zugriff testen. Beispiel:

EXEC master.dbo.sp_addlinkedserver @server = N'ENTWWEB01', @srvproduct=N'OraOLEDB', @provider=N'OraOLEDB.Oracle', @datasrc=N'DBWEBENTW3'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ENTWWEB01',@useself=N'False',@locallogin=NULL,@rmtuser=N'WEBDATA',@rmtpassword='######'

EXEC master.dbo.sp_addlinkedserver @server = N'ENTWWEB02', @srvproduct=N'OraOLEDB', @provider=N'OraOLEDB.Oracle', @datasrc=N'DBWEBENTW3'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ENTWWEB02',@useself=N'False',@locallogin=NULL,@rmtuser=N'WEBFRW',@rmtpassword='######'

EXEC master.dbo.sp_addlinkedserver @server = N'ENTWWEB03', @srvproduct=N'OraOLEDB', @provider=N'OraOLEDB.Oracle', @datasrc=N'DBWEBENTW3'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ENTWWEB03',@useself=N'False',@locallogin=NULL,@rmtuser=N'WEBSERVICES',@rmtpassword='######'
GO


6: Erledigt. Jetzt ist z.B. Sowas möglich:

SELECT * 
    FROM ENTWWEB03..WEBSERVICES.ASPNET_USERS au
    INNER JOIN ENTWWEB03..WEBSERVICES.ASPNET_USER_EXTENSIONS aue ON au.USERID = aue.USERID
    INNER JOIN PRODDB01..GUTINGIA.P p ON aue.PNR = p.p_NR AND p.HIST_KZ = 2;

Also JOINs über verschiedene Users hinweg. Ohne Synonyme und Ähnliches.

Kommentar schreiben

Loading