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.