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.
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.
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
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:
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.
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!
Situation similaire pour la configuration suivante:
Ma solution:
Outre d’autres réponses intéressantes, il me fallait simplement donner des autorisations NTFS au dossier d’installation d’Oracle.