web-dev-qa-db-fra.com

"Impossible de créer une instance de OLE Fournisseur de base de données "erreur en tant qu'utilisateur d'authentification Windows

J'essaye de lancer openrowset à partir de MS SQL Server sur un serveur Oracle.

Quand j'exécute la commande suivante:

select * from
OPENROWSET('OraOLEDB.Oracle','srv';'user';'pass', 
'select * from table')

l'erreur suivante se produit

Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "(null)".

Quelqu'un peut-il me dire comment je peux utiliser openrowset avec OraOLEDB.Oracle?

J'utilise la version 64 bits de MS SQL Server et le pilote OLEDB Oracle.

Modifier

J'ai essayé ceci sur deux machines exécutant Windows 7 x64 & Windows Server 2008 x64 avec MS SQL Server 2008 x64 . Les deux ont montré le même message d'erreur.

18
th1rdey3

Dans SQL Server Enterprise Manager, ouvrez \Server Objects\Linked Servers\Providers, cliquez avec le bouton droit sur le fournisseur OraOLEDB.Oracle, sélectionnez les propriétés et cochez l'option "Allow inprocess". Recréez votre serveur lié et testez à nouveau.

Vous pouvez également exécuter la requête suivante si vous n'avez pas accès à SQL Server Management Studio:

EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1
44
David Brabant

A couru dans cette question où le serveur lié fonctionnerait pour les utilisateurs qui étaient des administrateurs locaux sur le serveur, mais pas pour n'importe qui d'autre. Après de nombreuses heures de travail, j'ai réussi à résoudre le problème en procédant comme suit:

  1. Exécutez (CTRL + R) “dcomcnfg”. Naviguez jusqu'à «Services de composants -> Ordinateurs -> Poste de travail -> Configuration DCOM».
  2. Ouvrez la page de propriétés de «MSDAINITIALIZE».
  3. Copiez le "ID de l'application" sur la page de propriétés.
  4. Fermez “dcomcnfg”.
  5. Exécutez "regedit". Accédez à “HKEY_CLASSES_ROOT\AppID {???}” avec le ??? représentant l'ID d'application que vous avez copié à l'étape 3.
  6. Cliquez avec le bouton droit sur le dossier «{???}» et sélectionnez «Autorisations».
  7. Ajoutez le groupe d'administrateurs locaux aux autorisations, accordez-leur un contrôle total.
  8. Clôture de "regedit".
  9. Redémarrez le serveur.
  10. Exécutez “dcomconfig”. Naviguez jusqu'à «Services de composants -> Ordinateurs -> Poste de travail -> Configuration DCOM».
  11. Ouvrez la page de propriétés de «MSDAINITIALIZE».
  12. Dans l'onglet «Sécurité», sélectionnez «Personnaliser» sous «Autorisations de lancement et d'activation», puis cliquez sur le bouton «Modifier».
  13. Ajoutez «Utilisateurs authentifiés» et accordez-leur 4 autorisations de lancement et d'activation.
  14. Fermez “dcomcnfg”.
  15. Recherchez le répertoire racine d'installation Oracle. "E:\Oracle" dans mon cas.
  16. Modifiez les propriétés de sécurité du répertoire racine Oracle. Ajoutez «Utilisateurs authentifiés» et accordez-leur les autorisations «Lecture et exécution», «Liste du contenu du dossier» et «Lecture». Appliquez les nouvelles autorisations.
  17. Cliquez sur le bouton «Autorisations avancées», puis sur «Modifier les autorisations». Sélectionnez «Remplacer toutes les autorisations d'objet enfant par des autorisations pouvant être héritées de cet objet». Appliquez les nouvelles autorisations.
  18. Recherchez le fournisseur «OraOLEDB.Oracle» dans SQL Server. Assurez-vous que le paramètre “Allow Inprocess” est coché.
  19. Redémarrez le serveur.
12
Matt Anderson

Lors de la connexion à SQL Server avec une authentification Windows (par opposition à un compte SQL Server local), toute tentative d'utilisation d'un serveur lié peut générer le message d'erreur suivant:

Cannot create an instance of OLE DB provider "(OLEDB provider name)"...

La réponse la plus directe à ce problème est fournie par Microsoft KB 2647989 , car "les paramètres de sécurité de la classe MSDAINITIALIZE DCOM sont incorrects". 

La solution consiste à corriger les paramètres de sécurité pour MSDAINITIALIZE. Dans Windows Vista et les versions ultérieures, la classe appartient à TrustedInstaller. Par conséquent, la propriété de MSDAINITIALIZE doit être modifiée avant que la sécurité ne puisse être ajustée. Le KB ci-dessus a des instructions détaillées pour le faire.

Ce message de blog MSDN décrit la raison :

MSDAINITIALIZE est une classe COM fournie par OLE DB. Cette classe peut analyser les chaînes de connexion à la base de données OLE et charger/initialiser le fournisseur en fonction des valeurs de propriété de la chaîne de connexion. MSDAINITILIAZE est lancé par les utilisateurs connectés à SQL Server. Si l'authentification Windows est utilisée pour se connecter à SQL Server, le fournisseur est initialisé sous le compte d'utilisateur connecté. Si l'utilisateur connecté est une connexion SQL, le fournisseur est initialisé sous le compte de service SQL Server. En fonction du type de connexion utilisé, les autorisations sur MSDAINITIALIZE doivent être fournies en conséquence.

Le problème remonte au moins à SQL Server 2000; KB 280106 de Microsoft décrit l'erreur (voir "Message 3") et propose le correctif suggéré pour la définition de l'indicateur En cours de traitement pour le fournisseur OLEDB.

Bien que le réglage En cours puisse résoudre le problème immédiat, il se peut que ce ne soit pas ce que vous souhaitiez. Selon Microsoft, 

L'instanciation du fournisseur en dehors du processus SQL Server protège le processus SQL Server d'erreurs dans le fournisseur. Lorsque le fournisseur est instancié en dehors du processus SQL Server, les mises à jour ou les insertions faisant référence à de longues colonnes (text, ntext ou image) ne sont pas autorisées . - Doc. Propriétés du serveur lié pour SQL Server 2008 R2 .

La meilleure solution consiste à suivre les instructions de Microsoft et à ajuster la sécurité MSDAINITIALIZE.

7
patrickmdnet

Pour l'erreur 7302 en particulier, j'ai découvert dans mon registre, lors de la recherche de OraOLEDB.Oracle, que l'emplacement InprocServer32 était incorrect.

Si c'est le cas ou si vous ne trouvez pas cette chaîne dans le registre, vous devrez alors installer ou réenregistrer le composant. 

Je devais supprimer la clé du niveau GUID, puis rechercher la clé ProgID (OraOLEDB.Oracle) et la supprimer également. (Le ProgID est lié au CLSID sous forme de paire).

Ensuite, j'ai réinscrit OraOLEDB.Oracle en appelant regsvr32.exe sur ORAOLEDB * .dll.

Le simple fait de s’inscrire seul ne résout pas le problème, je dois donc supprimer les clés de registre pour qu’il pointe vers le bon emplacement. Sinon, piratez l'emplacement InprocServer32.

Maintenant, j'ai l'erreur 7308, à propos d'appartements à un seul thread; rouler sur!

1
GilesDMiddleton

Situation similaire pour la configuration suivante:

  • Windows Server 2012 R2 Standard
  • MS SQL Server 2008 (testé également SQL 2012)
  • Client Oracle 10g (OracleDB v8.1.7)
  • Fournisseur MSDAORA
  • Erreur ID: 7302

Ma solution:

  • Installez 32bit MS SQL Server (MSDAORA 64 bits n'existe pas)
  • Installez le correctif 32bit Oracle 10g 10.2.0.5 (configurez la compatibilité W7 sur setup.exe).
  • Redémarrer les services SQL
  • Vérifier Autoriser en cours dans le fournisseur MSDAORA
  • Tester la connexion au serveur Oracle lié
0
gaffcz

Outre d’autres réponses intéressantes, il me fallait simplement donner des autorisations NTFS au dossier d’installation d’Oracle.

0
jaraics