Introduction
Dans le cadre d’une opération d’insertion en batch en utilisant la commande BULK INSERT sur un serveur de base de données SQL Server on peut être confronté à une erreur système d’exploitation indiquant qu’un problème d’ouverture du fichier source à cause d’un Accès refusé bloque l’exécution de l’opération.
Il faudra noter que l’exécution de la même requête sur le serveur SQL lui même ne génère par cette erreur mais s’exécutera sans aucun problème.
Causes
Le fait que la requête s’exécute convenablement depuis le serveur de base de données lui et pas depuis une autre machine ou un poste client, exclu automatiquement le fait que le compte avec lequel la requête est lancée ne dispose pas des privilèges nécessaires pour la réalisation de cette opération.
Malgré tout, c’est bien un problème de sécurité qui est exposé par ce message d’erreur, en effet et vu que nous somme dans un contexte où la requête est lancée depuis un poste distant et qui procèdera à l'a lecture d’un fichier depuis un partage sur un autre serveur et qui fera appel à la procédure BULK INSERT sur le serveur de base de données, ce mécanisme et dans une infrastructure Windows implique le recourt à l’authentification Kerberos et bien sûr aux prérequis relatif à cette technologie.
Résolution
Pour pouvoir exécuter la requête sans problème il existe deux méthodes:
Méthode 1
La première méthode est simple et elle consiste tout simplement à utiliser un compte SQL pour se connecter au serveur de base de données au lieu d’un compte Windows et bien sûre s’assurer que le compte de service du serveur de bases de données SQL Server accède au fichiers source, le login SQL devra bien sûr avoir le droit bulkadmin au niveau du serveur SQL.
Méthode 2
Configurer le serveur de base de données et le compte de service SQL pour permettre ce genre d’opération en :
Configurer le compte de service SQL
En ajoutant le SPN MSSQLSvc au compte de service utilisé pour le démarrage du service SQL comme suit :
Si c’est une instance par défaut exécuter :
SETSPN –A MSSQLSvc/<fqdn du serveur SQL> <Nom du Compte de Service>
SETSPN –A MSSQLSvc/<fqdn du serveur SQL>:1433 <Nom du Compte de Service>
Si c’est une instance nommée:
SETSPN –A MSSQLSvc/<fqdn du serveur SQL>:<Nom de l’instance>
SETSPN –A MSSQLSvc/<fqdn du serveur SQL>:<Port d’écoute de l’instance>
Approuver le compte de service pour la délégation au niveau de l'AD.
Configuration du compte machine du serveur de base de données
Approuver le compte machine du serveur de base de données pour la délégation au niveau de l’AD.