Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2012 interrogeant les données Access 2007 à l'aide de l'erreur OPENROWSET

Enfin, après plusieurs tentatives infructueuses pour que SQL Server "parle" à une base de données Access - soit en tant que "serveur lié" dans SSMS, soit via OPENROWSET() dans T-SQL - J'ai trouvé ce billet de blog qui proposait les trois (3) suggestions suivantes.

Tweak #1 :Paramètres du fournisseur OLE DB

Le fournisseur OLE DB pour ACE (ou Jet) doit avoir les options "Paramètre dynamique" et "Autoriser inprocess" activées. Dans SSMS, ouvrez le

Objets serveur> Serveurs liés> Fournisseurs

branche, faites un clic droit sur "Microsoft.ACE.OLEDB.12.0" (ou "Microsoft.Jet.OLEDB.4.0"), choisissez "Propriétés", et assurez-vous que ces options sont sélectionnées :

Ajustement n° 2 :Autorisations du dossier temporaire

C'est celui qui m'a laissé perplexe.

Apparemment, SQL Server doit écrire des informations dans un fichier temporaire lors de l'exécution d'une requête OLE DB sur une base de données Access. Étant donné que SQL Server s'exécute en tant que service, il utilise le dossier %TEMP% du compte sous lequel le service s'exécute.

Si le service SQL Server s'exécute sous le compte "Service réseau" intégré, le dossier temporaire est

%SystemRoot%\ServiceProfiles\NetworkService\AppData\Local\Temp

et s'il s'exécute sous le compte "Service local" intégré, le dossier temporaire est

%SystemRoot%\ServiceProfiles\LocalService\AppData\Local\Temp

Mon problème était que SSMS fonctionnait sous mon compte (pas NETWORK SERVICE) donc je n'avais qu'un accès en lecture au dossier Temp

Une fois que je me suis accordé les autorisations de modification sur ce dossier

et activé les requêtes OPENROWSET comme documenté dans une autre question ici, à savoir ...

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

... ma requête a bien fonctionné :

Tweak #3 :memory_to_reserve

Bien que je n'aie pas eu besoin de l'utiliser dans mon cas, le blog susmentionné affirme également que l'ajustement du paramètre de démarrage "-g memory_to_reserve" pour le service SQL Server peut également aider à éviter des erreurs similaires. Pour ce faire :

  • lancer le gestionnaire de configuration SQL Server
  • faites un clic droit sur le service SQL Server (onglet "Services SQL Server") et choisissez "Propriétés"
  • dans l'onglet "Avancé", ajoutez -g512; au paramètre "Paramètres de démarrage"
  • redémarrer le service SQL Server

Pour plus de détails sur le paramètre "memory_to_reserve", consultez l'article MSDN ici.