J'ai créé un service Web qui enregistre des données dans db. Mais je reçois cette erreur:
Impossible d'ouvrir la base de données "test" demandée par le login. 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
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 est en cours d'exécution.
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)?
UPDATE: Ok, vous utilisez l'authentification Windows intégrée -> vous devez créer un identifiant SQL Server pour "xyz\ASPNET" sur votre serveur SQL Server ou modifier votre chaîne de connexion de la manière suivante:
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.
J'irais pour la 2ème option: le message d'erreur implique que la base de données par défaut n'y est pas ou pas du tout, plutôt que d'être configurée en tant que login.
Pour tester s'il est configuré en tant que login
SELECT SUSER_ID('xyz\ASPNET') -- (**not** SUSER_SID)
Si NULL
CREATE LOGIN [xyz\ASPNET] FROM WINDOWS
Si non NULL
USE test
GO
SELECT USER_ID('xyz\ASPNET')
Si NULL
USE test
GO
CREATE USER [xyz\ASPNET] FROM LOGIN [xyz\ASPNET]
La meilleure solution au problème de connexion consiste à créer un utilisateur de connexion dans sqlServer. Voici les étapes à suivre pour créer une connexion SQL Server utilisant l'authentification Windows (SQL Server Management Studio):
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.
La plupart du temps, ce n'est pas un problème de connexion, mais un problème de 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, celle-ci ne sera pas créée en premier lieu. Dans ce cas, si vous essayez de vous connecter, quel que soit l'utilisateur, la connexion échouera. Cela se produit généralement en raison d'une mauvaise interprétation logique du contexte de la 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 en conflit avec le modèle).
Dans mon cas, le code compilé correctement, le 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.
J'ai eu ce problème et ce qui l'a résolu pour moi était de:
L'erreur se présente comme un message semblable à ceci:
Impossible d'ouvrir la base de données "DATABASE NAME" demandée par le login. Le login échoué. La connexion a échoué pour l'utilisateur XYZ.
La solution est posée dans les étapes suivantes. Vous ne perdrez aucune donnée dans votre base de données et vous ne devriez pas supprimer votre fichier de base de données!
Pré-requis: Vous devez avoir installé SQL Server Management Studio (Full ou Express).
La source de la solution:https://www.codeproject.com/Tips/775607/How-to-fix-LocalDB-Requested-Login-failed
Pour moi, la base de données n'a pas été créée et le code EF doit d'abord l'avoir créée mais elle doit toujours se terminer avec cette erreur. La même chaîne de connexion fonctionnait dans le projet Web par défaut d'aspnet Core. La solution était d'ajouter
_dbContext.Database.EnsureCreated()
avant le premier contact avec la base de données (avant l'ensemencement dans la base de données).
J'ai utilisé l'authentification Windows pour me connecter au fichier .mdf de la base de données locale etmon serveur local était serveur SQL 2014 .
string sqlString = " Data Source = (LocalDB)\\MSSQLLocalDB;" + "AttachDbFilename = F:\\.........\\myDatabase.mdf; Integrated Security = True; Connect Timeout = 30";
La meilleure option serait d'utiliser l'authentification intégrée Windows, car elle est plus sécurisée que l'authentification SQL. Créez un nouvel utilisateur Windows sur le serveur SQL avec les autorisations nécessaires et modifiez l'utilisateur IIS dans les paramètres de sécurité du pool d'applications.
Je n'ai pas vu cela mentionné dans les numéros précédents, alors laissez-moi vous proposer une autre possibilité. Il se pourrait que IFItest
ne soit pas accessible ou n’existe tout simplement pas. Par exemple, si l'une d'entre elles possède plusieurs 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 celui qui convient pour la configuration actuelle.
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';
Il suffit de remplacer user('ftool')
en conséquence.
Inspiré par la réponse de cyptus que j'ai utilisée
_dbContext.Database.CreateIfNotExists();
sur EF6 avant le premier contact avec la base de données (avant l’amorçage de la base de données).
Cela arrive aussi quand vous tapez un nom incorrect de DB
ex : xxx-db-dev to xxx-dev-db
Parfois, c'est juste une erreur stupide. Je prends plus de 1 heure pour découvrir ceci :( parce que je viens d’essayer beaucoup de chose difficile en premier
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.
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. Je active les journaux du serveur SQL et je découvre 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 était en train de redémarrer 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.
Cela fonctionne pour moi.
Lire ce blog.
Même si vous avez défini la connexion en tant que propriétaire de la base de données et le mappage utilisateur pour la base de données qui utilisera la connexion, vérifiez que l'utilisateur de la base de données réel (et pas uniquement la connexion) a le rôle de "propriétaire".
J'ai constaté que je devais également définir l'option UserMapping lors de la création d'un nouveau login, ce qui a résolu le problème pour moi. J'espère que cela aidera tous ceux qui se sont retrouvés coincés ici!
Edit: définir le login en tant que propriétaire de la base de données a également résolu le problème suivant.
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é "MYDOMAINNAME\HOSTNAME $" à la connexion à la base de données et lui avoir accordé l'accès sysadmin, puis ajouté un utilisateur pour cette connexion sur ma base de données cible et l'avoir rendu dbowner, la même erreur se produisait. Apparemment, je devais faire la même chose pour la connexion 'NT AUTHORITY\SYSTEM'. Après 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.
Parfois, ce problème peut apparaître si vous ouvrez cette base de données sur un autre serveur SQL (par exemple, vous lancez SQL Management Studio (SMS) et ajoutez cette base de données) sans oublier d'arrêter ce serveur. En conséquence, votre application tente de se connecter avec un utilisateur déjà connecté à 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 répartiteur.
Toutes mes excuses pour le mauvais anglais ., Cordialement, Ignat.
NB: Si vous utilisez un service Windows pour héberger le service Web.
Vous devez vous assurer que votre service Web utilise le bon compte de connexion pour vous connecter à SQL Server.