webentwicklung-frage-antwort-db.com.de

Msgstr "Kann keine Instanz von erstellen OLE Fehler des DB-Anbieters als Windows-Authentifizierungsbenutzer

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.

Bearbeiten

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.

18
th1rdey3

Ö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
44
David Brabant

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:

  1. Führen Sie (STRG + R) "dcomcnfg" aus. Navigieren Sie zu "Komponentendienste -> Computer -> Arbeitsplatz -> DCOM-Konfiguration".
  2. Öffnen Sie die Eigenschaftsseite von "MSDAINITIALIZE".
  3. Kopieren Sie die "Anwendungs-ID" auf der Eigenschaftenseite.
  4. Schließen Sie "dcomcnfg".
  5. Führen Sie "regedit" aus. Navigieren Sie mit ??? zu "HKEY_CLASSES_ROOT\AppID {???}". die Anwendungs-ID darstellt, die Sie in Schritt 3 kopiert haben.
  6. Klicken Sie mit der rechten Maustaste auf den Ordner "{???}" und wählen Sie "Berechtigungen".
  7. Fügen Sie die lokalen Administratorengruppen zu den Berechtigungen hinzu, und erteilen Sie ihnen Vollzugriff.
  8. Schließen Sie "regedit".
  9. Starten Sie den Server neu.
  10. Führen Sie "dcomconfig" aus. Navigieren Sie zu "Komponentendienste -> Computer -> Arbeitsplatz -> DCOM-Konfiguration".
  11. Öffnen Sie die Eigenschaftsseite von "MSDAINITIALIZE".
  12. Wählen Sie auf der Registerkarte "Sicherheit" unter "Start- und Aktivierungsberechtigungen" die Option "Anpassen" aus und klicken Sie auf die Schaltfläche "Bearbeiten".
  13. Fügen Sie "Authentifizierte Benutzer" hinzu und erteilen Sie ihnen alle 4 Start- und Aktivierungsberechtigungen.
  14. Schließen Sie "dcomcnfg".
  15. Suchen Sie nach dem Oracle-Installationsstammverzeichnis. "E:\Oracle" in meinem Fall.
  16. Bearbeiten Sie die Sicherheitseigenschaften des Oracle-Stammverzeichnisses. Fügen Sie "Authentifizierte Benutzer" hinzu und erteilen Sie ihnen die Berechtigungen "Lesen & Ausführen", "Ordnerinhalt auflisten" und "Lesen". Wenden Sie die neuen Berechtigungen an.
  17. Klicken Sie auf die Schaltfläche "Erweiterte Berechtigungen" und dann auf "Berechtigungen ändern". Wählen Sie "Alle untergeordneten Objektberechtigungen durch vererbbare Berechtigungen für dieses Objekt ersetzen". Wenden Sie die neuen Berechtigungen an.
  18. Suchen Sie in SQL Server nach dem Anbieter "OraOLEDB.Oracle". Stellen Sie sicher, dass der Parameter "Prozess zulassen" aktiviert ist.
  19. Starten Sie den Server neu.
12
Matt Anderson

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.

7
patrickmdnet

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!

1
GilesDMiddleton

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!

0
Josh Jay

Ähnliche Situation für folgende Konfiguration:

  • Windows Server 2012 R2 Standard
  • MS SQL Server 2008 (getestet auch SQL 2012)
  • Oracle 10g-Client (OracleDB v8.1.7)
  • MSDAORA-Anbieter
  • Fehler-ID: 7302

Meine Lösung:

  • Installiere 32bit MS SQL Server (64bit MSDAORA ist nicht vorhanden)
  • Installieren Sie den 32bit Oracle 10g 10.2.0.5-Patch (legen Sie die W7-Kompatibilität für setup.exe fest).
  • Starten Sie die SQL-Dienste neu
  • Aktivieren Sie im MSDAORA-Provider Zulassen in Bearbeitung
  • Testen Sie die verknüpfte Oracle-Serververbindung
0
gaffcz

Abgesehen von anderen großartigen Antworten musste ich nur NTFS-Berechtigungen für den Oracle-Installationsordner erteilen. (Ich gab Lesezugriff)

0
jaraics