Ich versuche, Openrowset von MS SQL Server auf einem Oracle-Server auszuführen.
Wenn ich den folgenden Befehl ausführen:
select * from
OPENROWSET('OraOLEDB.Oracle','srv';'user';'pass',
'select * from table')
der folgende Fehler tritt auf
Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "(null)".
Kann mir jemand sagen, wie ich openrowset mit OraOLEDB.Oracle
verwenden kann?
Ich verwende eine 64-Bit-Version von MS SQL Server und Oracle OLEDB-Treiber.
Ich habe dies auf zwei Computern ausprobiert, auf denen Windows 7 x64 & Windows Server 2008 x64 mit MS SQL Server 2008 x64 läuft. Beide zeigten die gleiche Fehlermeldung.
Öffnen Sie in SQL Server Enterprise Manager \Server Objects\Linked Servers\Providers
, klicken Sie mit der rechten Maustaste auf den OraOLEDB.Oracle
-Provider, wählen Sie Eigenschaften aus und aktivieren Sie die Option "Allow inprocess"
. Erstellen Sie Ihren Verbindungsserver neu und testen Sie ihn erneut.
Sie können auch die folgende Abfrage ausführen, wenn Sie keinen Zugriff auf SQL Server Management Studio haben:
EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1
Dieses Problem wurde behoben, bei dem der Verbindungsserver für Benutzer funktionierte, die lokale Administratoren auf dem Server waren, nicht jedoch für andere. Nachdem ich viele Stunden herumgespielt hatte, konnte ich das Problem mit den folgenden Schritten beheben:
Beim Herstellen einer Verbindung zu SQL Server mit Windows-Authentifizierung (im Gegensatz zu einem lokalen SQL Server-Konto) kann der Versuch, einen Verbindungsserver zu verwenden, zu einer Fehlermeldung führen:
Cannot create an instance of OLE DB provider "(OLEDB provider name)"...
Die direkteste Antwort auf dieses Problem wird von Microsoft KB 2647989 bereitgestellt, da "Sicherheitseinstellungen für die DCOM-Klasse MSDAINITIALIZE nicht korrekt sind."
Die Lösung besteht darin, die Sicherheitseinstellungen für MSDAINITIALIZE festzulegen. In Windows Vista und höher befindet sich die Klasse im Besitz von TrustedInstaller. Daher muss der Besitz von MSDAINITIALIZE geändert werden, bevor die Sicherheit angepasst werden kann. In der obigen KB finden Sie detaillierte Anweisungen.
Dieser MSDN-Blogbeitrag beschreibt den Grund :
MSDAINITIALIZE ist eine COM-Klasse, die von OLE DB bereitgestellt wird. Diese Klasse kann OLE DB-Verbindungszeichenfolgen analysieren und den Anbieter basierend auf den Eigenschaftswerten in der Verbindungszeichenfolge laden/initialisieren. MSDAINITILIAZE wird von Benutzern initiiert, die mit SQL Server verbunden sind. Wenn die Windows-Authentifizierung zum Herstellen einer Verbindung mit SQL Server verwendet wird, wird der Anbieter unter dem angemeldeten Benutzerkonto initialisiert. Wenn der angemeldete Benutzer ein SQL-Login ist, wird der Provider unter dem SQL Server-Dienstkonto initialisiert. Abhängig von der Art der verwendeten Anmeldung müssen Berechtigungen für MSDAINITIALIZE entsprechend angegeben werden.
Das Problem geht mindestens auf SQL Server 2000 zurück. KB 280106 von Microsoft beschreibt den Fehler (siehe "Nachricht 3") und enthält den vorgeschlagenen Fix zum Setzen des In-Prozess-Flags für den OLEDB-Provider.
Durch die Einstellung von In Process kann das unmittelbare Problem gelöst werden. Möglicherweise ist es jedoch nicht das, was Sie möchten. Nach Angaben von Microsoft
Durch die Instanziierung des Providers außerhalb des SQL Server-Prozesses wird der SQL Server-Prozess geschützt von Fehlern im Provider. Wenn der Anbieter außerhalb des SQL Server-Prozesses instanziiert wird, wird Aktualisierungen oder Einfügungen, die auf lange Spalten (Text, Ntext oder Bild) verweisen, sind nicht zulässig . - Eigenschaftendokument für verknüpfte Server für SQL Server 2008 R2 .
Die bessere Antwort ist, sich an die Microsoft-Anleitung zu halten und die Sicherheit von MSDAINITIALIZE anzupassen.
Insbesondere für Fehler 7302 habe ich in meiner Registrierung bei der Suche nach OraOLEDB.Oracle festgestellt, dass der InprocServer32-Speicherort falsch war.
Wenn dies der Fall ist oder Sie diese Zeichenfolge nicht in der Registrierung finden können, müssen Sie die Komponente installieren oder erneut registrieren.
Ich musste den Schlüssel aus der Ebene GUID löschen und dann den ProgID-Schlüssel (OraOLEDB.Oracle) finden und auch diesen löschen. (Die ProgID ist als Paar mit der CLSID verknüpft.).
Dann habe ich OraOLEDB.Oracle durch den Aufruf von regsvr32.exe unter ORAOLEDB * .dll erneut registriert.
Die erneute Registrierung allein löste das Problem nicht, ich musste die Registrierungsschlüssel löschen, damit sie auf den richtigen Speicherort verweist. Alternativ können Sie den InprocServer32-Speicherort hacken.
Jetzt habe ich Fehler 7308, über Single-Threaded-Apartments; weiter rollen!
Dieselbe Fehlermeldung bei SQL Server 2017 beim Versuch, eine Verbindung zu Oracle 12c herzustellen. Wir konnten Oracle SQL Developer verwenden, um eine Verbindung zur Quellendatenbank herzustellen, aber der Verbindungsserver hat den Fehler 7302 weiterhin ausgegeben.
Am Ende haben wir alle SQL Services gestoppt, dann die ODAC-Komponenten neu installiert. Startete die SQL Services sichern und voila!
Ähnliche Situation für folgende Konfiguration:
Meine Lösung:
Abgesehen von anderen großartigen Antworten musste ich nur NTFS-Berechtigungen für den Oracle-Installationsordner erteilen. (Ich gab Lesezugriff)