Impossible d'ouvrir la base de données «test» demandé par la connexion. La connexion a échoué. La connexion a échoué pour l'utilisateur 'xyz \ ASPNET'

99

J'ai créé un service Web qui enregistre certaines données dans la base de données. Mais j'obtiens cette erreur:

Impossible d'ouvrir la base de données "test" demandé par la connexion. La connexion a échoué. La connexion a échoué pour l'utilisateur «xyz \ ASPNET».

Ma chaîne de connexion est

Data Source=.\SQLExpress;Initial Catalog=IFItest;Integrated Security=True
coure2011
la source
Nous avons besoin de beaucoup plus d'informations avant de pouvoir aider à diagnostiquer cela.
sblom
J'ai eu ce problème et j'ai fermé le studio visuel et l'
ai rouvert

Réponses:

47

Eh bien, l'erreur est assez claire, non? Vous essayez de vous connecter à votre serveur SQL avec l'utilisateur «xyz / ASPNET» - c'est le compte sous lequel votre application ASP.NET s'exécute.

Ce compte n'est pas autorisé à se connecter à SQL Server - créez une connexion sur SQL Server pour ce compte ou spécifiez un autre compte SQL Server valide dans votre chaîne de connexion.

Pouvez-vous nous montrer votre chaîne de connexion (en mettant à jour votre question d'origine)?

MISE À JOUR: Ok, vous utilisez l'authentification Windows intégrée -> vous devez créer une connexion SQL Server pour "xyz \ ASPNET" sur votre serveur SQL - ou changer votre chaîne de connexion en quelque chose comme:

connectionString="Server=.\SQLExpress;Database=IFItest;User ID=xyz;pwd=top$secret"

Si vous avez un utilisateur "xyz" avec un mot de passe "top $ secret" dans votre base de données.

marc_s
la source
11
Non "n'est pas autorisé à se connecter à SQL Server", mais "n'est pas autorisé à utiliser la base de données" test "".
wRAR
@wRAR: vrai - mais je suppose que la chance que la connexion de l'utilisateur existe sur le serveur, mais qu'elle ne soit pas activée dans cette base de données particulière, est probablement mince (du moins je pense)
marc_s
Voir aussi "Database = IFItest" vs "test", bien que cela puisse être une erreur d'impression.
wRAR
2
Un point que vous n'avez jamais abordé est que le nom de la base de données peut également être erroné. J'étais en train de recevoir un message d'exception de recherche identique à partir de mon serveur Azure SQL Server, et il s'est avéré que j'avais donné un nom erroné à ma base de données dans l'une des chaînes de connexion du code C # de mon projet ASP.NET.
Ron16
Ron, c'était mon problème. J'avais même vérifié l'orthographe, mais je l'ai ratée même à ce moment-là.
Darrell Lloyd Harvey le
32
  • Soit: "xyz \ ASPNET" n'est pas une connexion (dans sys.server_principals)
  • Ou: "xyz \ ASPNET" est configuré mais pas mappé à un utilisateur dans le test de base de données (sys.database_principals)

J'opterais pour la deuxième option: le message d'erreur implique que la base de données par défaut n'est pas là ou n'a pas de droits, plutôt que de ne pas être configurée en tant que connexion.

Pour tester s'il est configuré comme connexion

SELECT SUSER_ID('xyz\ASPNET') -- (**not** SUSER_SID)

Si NULL

CREATE LOGIN [xyz\ASPNET] FROM WINDOWS

Sinon NULL

USE test
GO
SELECT USER_ID('xyz\ASPNET')

Si NULL

USE test
GO
CREATE USER [xyz\ASPNET] FROM LOGIN [xyz\ASPNET]
gbn
la source
1
C'est tout simplement génial !, un flux de travail simple pour détecter et résoudre le problème.
Mazen el Senih
12

J'ai eu ce problème et ce qui l'a résolu pour moi était de:

  • Accédez aux pools d'applications dans IIS
  • Faites un clic droit sur le pool d'applications de mon projet
  • Dans la section Modèle de processus, ouvrez l'identité
  • Choisissez l'option de compte personnalisé
  • Entrez le nom d'utilisateur et le mot de passe de votre ordinateur.
ParPar
la source
8

La meilleure solution pour le problème de connexion est de créer un utilisateur de connexion dans sqlServer. Voici les étapes pour créer une connexion SQL Server qui utilise l'authentification Windows (SQL Server Management Studio):

  1. Dans SQL Server Management Studio, ouvrez l'Explorateur d'objets et développez le dossier de l'instance de serveur dans laquelle créer la nouvelle connexion.
  2. Cliquez avec le bouton droit sur le dossier Sécurité, pointez sur Nouveau, puis cliquez sur Connexion.
  3. Sur la page Général, entrez le nom d'un utilisateur Windows dans la zone Nom de connexion.
  4. Sélectionnez l'authentification Windows.
  5. Cliquez sur OK.

Par exemple, si le nom d'utilisateur est xyz\ASPNET, entrez ce nom dans la zone Nom de connexion.

Vous devez également modifier le mappage utilisateur pour autoriser l'accès à la base de données à laquelle vous souhaitez accéder.

Rajeev
la source
8

La plupart du temps, ce n'est pas un problème de connexion, mais un problème avec la création de la base de données elle-même. Donc, s'il y a une erreur lors de la création de votre base de données, elle ne sera pas créée en premier lieu. Dans ce cas, si vous essayez de vous connecter, quel que soit l'utilisateur, la connexion échoue. Cela se produit généralement en raison d'une mauvaise interprétation logique du contexte de base de données.

Visitez le site dans un navigateur et lisez VRAIMENT ces journaux d'erreurs, cela peut vous aider à repérer le problème avec votre code (généralement des problèmes de logique conflictuels avec le modèle).

Dans mon cas, le code s'est bien compilé, même problème de connexion, alors que je téléchargeais encore le studio de gestion, j'ai parcouru le journal des erreurs, corrigé mes contraintes de contexte de base de données et le site a commencé à fonctionner correctement .... pendant ce temps, le studio de gestion continue de télécharger

Le juge O.
la source
6

Pour moi, la base de données n'a pas été créée et le code EF aurait d'abord dû la créer mais toujours se terminer par cette erreur. La même chaîne de connexion fonctionnait dans le projet Web par défaut aspnet core. La solution était d'ajouter

_dbContext.Database.EnsureCreated()

avant le premier contact de la base de données (avant l'amorçage de la base de données).

cyptus
la source
4

Le problème

L'erreur se présente comme un message similaire à celui-ci:

Impossible d'ouvrir la base de données "DATABASE NAME" demandée par la connexion. La connexion a échoué. La connexion a échoué pour l'utilisateur XYZ.

  • L'erreur ne peut généralement pas être corrigée par un simple redémarrage de Visual Studio ou de l'ordinateur complet.
  • L'erreur peut également être trouvée sous la forme d'un fichier de base de données apparemment verrouillé.

Le correctif

La solution est posée dans les étapes suivantes. Vous ne perdrez aucune donnée de votre base de données et vous ne devez pas supprimer votre fichier de base de données!

Pré-requis: vous devez avoir installé SQL Server Management Studio (complet ou express)

  1. Ouvrez SQL Server Management Studio
  2. Dans la fenêtre "Se connecter au serveur" (Fichier-> Explorateur d'objets de connexion), saisissez ce qui suit:
    • Type de serveur: moteur de base de données
    • Nom du serveur: (localdb) \ v11.0
    • Authentification: [Tout ce que vous avez utilisé lorsque vous avez créé votre base de données locale. Probablement l'authentification Windows).
  3. Cliquez sur "Connecter"
  4. Développez le dossier "Bases de données" dans l'Explorateur d'objets (Affichage-> Explorateur d'objets, F8)
  5. Trouvez votre base de données. Il doit être nommé comme le chemin complet vers votre fichier de base de données (.mdf)
    • Vous devriez voir qu'il dit «(En attente de récupération)» à la fin du nom de la base de données ou lorsque vous essayez d'étendre la base de données, il ne pourra pas et peut ou non vous donner un message d'erreur.
    • C'est le problème! Votre base de données est essentiellement tombée en panne.
  6. Faites un clic droit sur la base de données puis sélectionnez "Tâches -> Détacher ...".
  7. Dans la fenêtre de détachement, sélectionnez votre base de données dans la liste et vérifiez la colonne qui dit "Supprimer les connexions"
  8. Cliquez sur OK.
  9. Vous devriez voir la base de données disparaître de la liste des bases de données. Votre problème devrait maintenant être résolu. Allez et exécutez votre application qui utilise votre localdb.
  10. Après avoir exécuté votre application, votre base de données réapparaîtra dans la liste des bases de données - c'est correct. Il ne devrait plus être dit «En attente de récupération» car il devrait fonctionner correctement.

La source de la solution: https://www.codeproject.com/Tips/775607/How-to-fix-LocalDB-Requested-Login-failed

Anton Lyhin
la source
Le problème est que je ne trouve même pas ce DB.
Shimmy Weitzhandler
3

Cela se produit également lorsque vous tapez un mauvais nom de DB

ex : xxx-db-dev to xxx-dev-db

Parfois, c'est juste une erreur stupide. Je prends environ plus d'une heure pour le découvrir: (parce que j'essaye juste beaucoup de choses difficiles en premier

Loup gris
la source
2

J'ai essayé de mettre à jour l'utilisateur et cela a fonctionné. Voir la commande ci-dessous.

USE ComparisonData// databaseName
EXEC  sp_change_users_login @Action='update_one', @UserNamePattern='ftool',@LoginName='ftool';

Remplacez simplement en user('ftool')conséquence.

shashank
la source
2

Cela fonctionne pour moi.

  1. Allez dans SQL Server >> Sécurité >> Connexions et faites un clic droit sur NT AUTHORITY \ NETWORK SERVICE et sélectionnez Propriétés
  2. Dans l'écran nouvellement ouvert des propriétés de connexion, allez dans l'onglet «Mappage des utilisateurs».
  3. Ensuite, dans l'onglet «User Mapping», sélectionnez la base de données souhaitée - en particulier la base de données pour laquelle ce message d'erreur est affiché.
  4. Cliquez sur OK.

Lisez ce blog.

http://blog.sqlauthority.com/2009/08/20/sql-server-fix-error-cannot-open-database-requested-by-the-login-the-login-failed-login-failed-for- service-réseau-autorité-utilisateur-nt /

Kamran
la source
merci, en utilisant "NT AUTHORITY \ SYSTEM" a résolu mon problème.
Farzad Karimi
2

J'ai utilisé l'authentification Windows pour me connecter au fichier .mdf de la base de données locale et mon serveur local était le serveur sql 2014. Mon problème a été résolu en utilisant cette chaîne de connexion:

string sqlString = " Data Source = (LocalDB)\\MSSQLLocalDB;" + "AttachDbFilename = F:\\.........\\myDatabase.mdf; Integrated Security = True; Connect Timeout = 30";
Ehsan
la source
J'ai dû supprimer cette partie "User Instance = True" pour que ma base de données locale fonctionne
Anonyme
2

Dans mon cas, c'est une question différente. La base de données est passée en mode mono-utilisateur et une deuxième connexion à la base de données montrait cette exception. Pour résoudre ce problème, suivez les étapes ci-dessous.

  1. Assurez-vous que l'explorateur d'objets pointe vers une base de données système comme master.
  2. Exécutez a exec sp_who2et trouvez toutes les connexions à la base de données 'my_db'. Tuez toutes les connexions en faisant KILL { session id }où l'identifiant de session est le SPID répertorié par sp_who2.
USE MASTER;
EXEC sp_who2
  1. Modifier la base de données
USE MASTER;
ALTER DATABASE [my_db] SET MULTI_USER
GO
Krishanth Rajkumar
la source
1

Je n'ai pas vu cela mentionné dans les numéros précédents, alors laissez-moi évoquer une autre possibilité. Il se peut que ce IFItestne soit pas accessible ou n'existe tout simplement pas. Par exemple, si l'on a un certain nombre de configurations, chacune avec sa propre base de données, il se peut que le nom de la base de données n'ait pas été changé pour le bon pour la configuration actuelle.

démongolem
la source
1

NB: si vous utilisez un service Windows pour héberger le webservice.

Vous devez vous assurer que votre service Web utilise le bon compte de connexion pour se connecter à SQL Server.

  • Services ouverts (je suppose que le service Windows a été installé)
  • Faites un clic droit sur le service et accédez aux propriétés.
  • Cliquez sur l'onglet "Connexion"
  • Cliquez sur le bouton radio "Ce compte"
  • Cliquez sur "Parcourir"
  • Entrez le nom d'utilisateur Pc dans le champ de texte et cliquez sur le bouton «Vérifier le nom» à droite.
  • Cliquez sur le texte dans le champ de texte, appuyez sur le bouton "OK"
  • entrez le mot de passe de connexion et appliquez
Koki Monoto
la source
1

Inspiré de la réponse de cyptus, j'ai utilisé

_dbContext.Database.CreateIfNotExists();

sur EF6 avant le premier contact de base de données (avant l'amorçage DB).

Jesse Hufstetler
la source
1

Si vous n'avez pas créé la base de données sur votre serveur, vous obtiendrez la même erreur de connexion. Assurez-vous que la base de données existe avant de vous connecter.

AmirHossein Rezaei
la source
1

J'ai rencontré ce problème en essayant d'écrire dans la base de données par défaut fournie dans le modèle asp.net mvc. Cela était dû au fait que la base de données n'avait pas encore été créée.

Pour créer la base de données et vous assurer qu'elle est accessible, procédez comme suit:

  1. Ouvrez la console du gestionnaire de packages dans Visual Studio
  2. Exécutez la commande "update-database"

Cela créera la base de données et exécutera toutes les migrations nécessaires dessus.

GrantByrne
la source
0

La meilleure option serait d'utiliser l'authentification intégrée de Windows car elle est plus sécurisée que l'authentification SQL. Créez un nouvel utilisateur Windows dans le serveur SQL avec les autorisations nécessaires et modifiez l'utilisateur IIS dans les paramètres de sécurité du pool d'applications.

Giorgi
la source
0

J'ai constaté que je devais également définir l'option UserMapping lors de la création d'une nouvelle connexion et cela a résolu le problème pour moi. J'espère que cela aidera tous ceux qui se sont également retrouvés coincés ici!

Modifier: définir la connexion en tant que propriétaire de la base de données a également résolu le problème suivant

DevDave
la source
0

Parfois, ce problème peut apparaître si vous ouvrez cette base de données dans un autre serveur SQL (par exemple, vous lancez sql managment studio (SMS) et ajoutez cette base de données) et oubliez d'arrêter ce serveur. En conséquence, votre application essaie de se connecter avec un utilisateur déjà connecté dans cette base de données sous un autre serveur. Pour résoudre ce problème, essayez d'arrêter ce serveur par Config. serveur SQL du répartiteur.

Mes excuses pour le mauvais anglais. Cordialement, Ignat.

utilisateur3041948
la source
0

Dans mon cas, l'application asp.net peut généralement se connecter à la base de données sans aucun problème. J'ai remarqué un tel message dans les journaux. J'allume les journaux du serveur SQL et je trouve ce message:

2016-10-28 10:27:10.86 Logon       Login failed for user '****'. Reason: Failed to open the explicitly specified database '****'. [CLIENT: <local machine>]
2016-10-28 10:27:13.22 Server      SQL Server is terminating because of a system shutdown. This is an informational message only. No user action is required.

Il semble donc que le serveur redémarrait et que le serveur SQL s'était arrêté un peu plus tôt que l'application ASP.NET et que la base de données n'était pas disponible pendant quelques secondes avant le redémarrage du serveur.

Tomas Kubes
la source
0

Même si vous avez défini la connexion en tant que propriétaire de la base de données et défini le mappage utilisateur pour la base de données qui utilisera la connexion, vérifiez que l'utilisateur réel de la base de données (et pas seulement la connexion) a le rôle de «propriétaire».

Chris Halcrow
la source
0

Dans mon cas, j'exécutais un service Windows sous l'identité «Système». L'erreur était:

System.Data.SqlClient.SqlException (0x80131904): 
Cannot open database "MyDbName" requested by the login. The login failed.
Login failed for user 'MYDOMAINNAME\HOSTNAME$'.

Le problème est que l'erreur est très trompeuse. Même après avoir ajouté la connexion 'MYDOMAINNAME \ HOSTNAME $' à la base de données, accordé à cette connexion l'accès sysadmin et ajouté un utilisateur pour cette connexion sur ma base de données cible, et fait de cet utilisateur dbowner, j'obtenais toujours la même erreur. Apparemment, j'avais besoin de faire de même pour la connexion 'NT AUTHORITY \ SYSTEM'. Après avoir fait cela, j'ai pu me connecter sans problème. Je ne sais pas pourquoi le message d'erreur se plaint de "MYDOMAINNAME \ HOSTNAME $". J'ai supprimé cette connexion et l'utilisateur correspondant et tout fonctionne toujours.

Greg Z.
la source