Récemment, j'ai mis à niveau LocalDB de la version 13 à la version 14 à l'aide du programme d'installation de SQL Server Express et de cette instruction . Après l'installation, j'ai arrêté l'instance par défaut existante (MSSQLLOCALDB) de la version 13 et en ai créée une nouvelle, qui utilisait automatiquement le moteur de serveur v14.0.1000.
J'utilise souvent LocalDB pour les tests d'intégration de base de données, c'est-à-dire que, dans mes tests xunit, je crée une base de données (temporaire) qui est supprimée à la fin du test. Depuis la nouvelle version, tous mes tests ont malheureusement échoué à cause du message d'erreur suivant:
CREATE FILE a rencontré l'erreur 5 du système d'exploitation (accès refusé.) En essayant d'ouvrir ou de créer le fichier physique 'C: \ Users \ kepflDBd0811493e18b46febf980ffb8029482a.mdf'
Ce qui est étrange, c'est que le chemin cible du fichier mdf est incorrect, une barre oblique inverse est manquante entre C: \ Users \ kepfl et DBd0811493e18b46febf980ffb8029482a.mdf (nom de base de données aléatoire pour un seul test). Les bases de données sont créées via la commande simple CREATE DATABASE [databaseName]
- rien de spécial ici.
Dans SSMS, je constate que les emplacements cibles pour les données, les journaux et les sauvegardes sont les suivants:
Cependant, lorsque j'essaie de mettre à jour l'emplacement, j'obtiens un autre message d'erreur:
Comment puis-je mettre à jour les emplacements par défaut afin que LocalDB puisse à nouveau créer des bases de données? Il est évident que LocalDB ne combine pas correctement le répertoire d’emplacement par défaut et le nom du fichier de base de données. Existe-t-il une entrée de registre que je puisse modifier? Ou autre chose?
Mise à jour après la réponse de Doug et le commentaire de Sepupic
Selon cette question de Stackoverflow , l'emplacement par défaut devrait également être modifiable via le registre. Cependant, si j'essaie de trouver les clés correspondantes "DefaultData", "DefaultLog" et "BackupDirectory", je ne les trouve pas dans mon registre. SQL Server v14 a-t-il renommé ces clés de registre ou déplacé ces informations hors du registre?
Réponses:
MISE À JOUR
À partir de la CU 6 pour SQL Server 2017, ce bogue a été corrigé. Il est maintenant possible d'exécuter les tâches suivantes avec succès:
Le problème et le fait qu'il est résolu dans CU6 sont décrits dans l'article de la base de connaissances suivant:
CORRECTIF: erreur "Accès refusé" lorsque vous essayez de créer une base de données dans SQL Server 2017 Express LocalDB
Pour obtenir la mise à jour cumulative, veuillez aller à la page suivante et récupérer la dernière version (la plus récente), qui peut être plus récente que CU6 selon le moment où vous voyez ceci:
Versions de construction de SQL Server 2017
CI-DESSOUS INFO OBSOLETE OF SQL SERVER 2017 CU6 (Paru le 2018-04-17)
L'absence de barre oblique inversée dans le nom combiné Chemin + Fichier semble constituer un bogue avec SQL Server 2017. Je viens de le rencontrer moi-même. J'ai même essayé d'éditer le registre pour ajouter une
DefaultData
chaîne de caractères Value pour C: \ Users \ MyAccountName \ dans les deux clés suivantes (les 3 chemins par défaut ne figurent dans aucune des clés de registre LocalDB que j'ai consultées):Et oui, j'ai arrêté et redémarré l'instance LocalDB dans les deux tentatives.
Cependant, je ne suis pas convaincu que le fait de ne pas pouvoir changer les chemins par défaut est un bogue, car il pourrait s'agir simplement d'une mauvaise documentation et d'une mauvaise gestion des erreurs combinées. Je dis cela parce que je viens d'essayer de modifier les emplacements par défaut pour les versions 2014, 2016 et 2017 de SQL Server LocalDB, et que tous aboutissaient à la même erreur, ce qui en soi est étrange en raison de son origine
RegCreateKeyEx()
, ce qui devrait traiter du registre et pas le système de fichiers.Il est regrettable que le chemin ne puisse pas être modifié en raison de l'absence de barre oblique inverse lors de la création d'une nouvelle base de données sans spécifier les fichiers à utiliser. Cependant, j'ai pu créer une nouvelle base de données en utilisant l'intégralité
CREATE DATABASE
syntaxe comme suit:la source
LOG ON
section de laCREATE DATABASE
déclaration. Les fichiers LDF semblent avoir été créés, par défaut, au même emplacement que le fichier MDF. (Notre cas d'utilisation de LocalDb est principalement destiné à être utilisé dans des tests automatisés.)J'ai rencontré le même problème et j'ai trouvé une solution de contournement qui ne devrait pas présenter d'inconvénient évident. (si j'oublie quelque chose, corrigez-moi, s'il vous plaît) . Il est basé sur la réponse de Solomons, mais sans la nécessité de spécifier directement le chemin absolu vers les fichiers de base de données.
Il utilise SQL dynamique et n’est pas vraiment joli, mais il fait le travail jusqu’à ce qu’il y ait une solution officielle au problème.
la source
QUOTENAME
au 2ème PARAMFORMATMESSAGE
et mettre des guillemets doubles autour du chemin du fichier:FORMATMESSAGE(N'CREATE DATABASE %s ON PRIMARY ( NAME = %s, FILENAME = "%s" )', QUOTENAME(@databaseName), QUOTENAME(@databaseName), @dataFilePath);
. Mais cela semble fonctionner comme vous l'avez maintenant, donc +1 pour cette approche. Il est toujours possible de coder en dur le nom ou de passer par un chemin: lorsque vous ne voulez pas utiliser laUSERPROFILE
racine. Mais vous pouvez autoriser cela ici et ne définir queInstanceDefaultDataPath
si@Path IS NULL
. :-)Je suis confronté à ce problème aussi. La seule solution que j'ai trouvée serait d'octroyer l'accès en écriture
c:\Users\
à Tout le monde (ou quelque chose du genre) et de le laisser créer les fichiers mdf où il le souhaite.la source
Merci pour votre explication concise de ce problème. J'ai rencontré le même problème hier. Je n'ai toujours pas trouvé de solution permanente, mais voici ma solution de contournement actuelle.
J'utilise la fonction Database.EnsureCreated () pour créer la base de données.
Définissez la chaîne de connexion pour inclure le paramètre ' AttachDBFilename = '.
Lancer l'application. Cela va générer une erreur:
mais cela créera la base de données.
Après cela, modifiez la chaîne de connexion et supprimez ' AttachDBFilename = '.
J'ai relancé l'application sans erreur et des tables ont été créées.
la source
CREATE DATABASE [databasename]
contre LocalDB, ce qui pose problème, car LocalDB concatène à tort le répertoire des emplacements par défaut avec le nom de la base de données généré aléatoirement (voir paragraphes 3 et 4 de ma question). J'ai besoin d'un moyen de corriger les emplacements par défaut afin que ce problème de concaténation ne se produise pas.AttachDBFilename
.