web-dev-qa-db-fra.com

Impossible d'initialiser l'objet source de données de OLE Fournisseur de base de données "MSDASQL" pour le serveur lié "(null)"

Avoir un problème intéressant. Je lis un fichier Excel sur un serveur via un OpenRowset au Sql2005. J'ai exécuté la requête plusieurs fois sans aucun problème. Je viens de sortir pour une réunion rapide et tout à coup, le message d'erreur "Impossible d'initialiser l'objet source de données de OLE fournisseur de base de données" MSDASQL "pour le serveur lié" (null)

Je me suis assuré que les fichiers ne sont pas utilisés sur le serveur et je les ai même supprimés et recopiés sur le serveur et j'obtiens toujours la même erreur.

UPDATE: Cela ne semble se produire que si je joins deux sélections parmi différents openrows. Si je lance les requêtes individuellement, elles fonctionnent toujours bien. J'ai fait la jointure auparavant sans aucun problème. Des idées?

10
StevenMcD

Le problème vient du fait que le dossier Temp de l'utilisateur sous lequel le service SQL Server est en cours d'exécution n'est pas accessible sous les informations d'identification exécutées par la requête. Essayez de définir la sécurité de ce dossier temporaire avec des restrictions minimales. Le nom distinctif créé à chaque fois que vous exécutez une requête openrowset peut ensuite être recréé sans conflit d'informations d'identification. Cela a fonctionné pour moi sans aucune exigence de redémarrage.

18
Rajesh

Nous avons fini par redémarrer le serveur de base de données et cela a semblé résoudre le problème. Peut-être que les fichiers étaient bloqués d'une manière ou d'une autre. Nous ne saurons jamais avec certitude si

5
StevenMcD

Je devais télécharger et installer "Microsoft Access Database Engine 2010 Redistributable" disponible ici .

"Ce problème est dû au fait qu’aucun pilote de texte ODBC 64 bits _ n’est installé sur votre serveur Windows 64 bits 2003. MSDASQL 64 bits fournit simplement un" pont "OLEDB/ODBC applications basées sur OLEDB et ADO (qui utilise OLEDB en interne) pour accéder à des sources de données par le biais de ODBC pilotes. " La source

3
dialex
/* Linked server between local(Client) SQL server and Remote SQL server 2005*/

USE master
GO
-- To use named parameters: Add linked server in the source (Local machine - eg: MachineName or LocalSeverLoginName)

sp_addlinkedserver 
 @server = N'LnkSrv_RemoteServer_TEST', 
 @srvproduct=N'', -- Leave it blank when its not 'SQL Server'
 @provider=N'SQLNCLI', -- see notes
 @datasrc=N'RemoteServerName', 
 @provstr=N'UID=sa;PWD=sa;'
 --,@catalog = N'MYDATABASE' eg: pubs
GO

/*
 Note: 
  To check provider name use the folling query in the destination server
   Select Provider From sys.servers
*/
----------------------------------------------------------------------------------------------------------
-- Optional
--EXEC sp_addlinkedsrvlogin 'LnkSrv_RemoteServer_TEST', 'true' -- (self is true) -- for LocalSeverLoginName
--GO

-- Remote login
sp_addlinkedsrvlogin
 @rmtsrvname = 'LnkSrv_RemoteServer_TEST',
 @useself = 'False',
 @rmtuser = 'sa',
 @rmtpassword = 'sa'
GO

-- OR
/*
IF the above add linked server login failed then try in the Linked Server (LnkSrv_RemoteServer_TEST) Property 
Select -> Security - > 'For a login not defined in the list above, Connection will:'

Choose - > Be made using this security context
SET Remote login: sa
With password: sa
*/
----------------------------------------------------------------------------------------------------------

-- Test server connection
declare @srvr nvarchar(128), @retval int;
set @srvr = 'LnkSrv_RemoteServer_TEST';
begin try
    exec @retval = sys.sp_testlinkedserver @srvr;
end try
begin catch
    set @retval = sign(@@error);
end catch;
if @retval <> 0
  raiserror('Unable to connect to server. This operation will be tried later!', 16, 2 );

-- OR

BEGIN TRY 
    EXEC sp_testlinkedserver N'LnkSrv_RemoteServer_TEST'; 
END TRY 
BEGIN CATCH 
    PRINT 'Linked Server not available'; 
    RETURN; 
END CATCH 
----------------------------------------------------------------------------------------------------------

-- Get access linked server database
SET xact_abort ON 
GO

BEGIN TRANSACTION
SELECT  *  FROM LnkSrv_RemoteServer_TEST.DBName.dbo.tblName 
COMMIT TRAN
GO

-- OR
SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM DBName.dbo.tblName')
GO

-- OR
SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM sys.databases Order by name')
GO
----------------------------------------------------------------------------------------------------------

Ce problème m'est arrivé aussi. Une combinaison d'activation de l'option de fournisseur "Autoriser le processus" pour OraOLEDB.Oracle fournir (SSMS> Objets serveur> Serveurs liés> Fournit> OraOLEDB.Oracle), redémarrer le service Windows SQL Server et ajuster les autorisations sur le fichier TNSNAMES.ora directement.

0
KirstieBallance