Partager via


MSSQLSERVER_4064

S'applique à : SQL Server

Détails

Attribut Valeur
Nom du produit SQL Server
ID de l’événement 4064
Source de l’événement MSSQLSERVER
Composant SQLEngine
Nom symbolique DB_UFAIL_FATAL
Texte du message La base de données utilisateur par défaut ne peut pas être ouverte. Échec de la connexion.

Explication

La connexion SQL Server n’a pas pu se connecter à SQL Server, soit en raison de problèmes d’autorisation avec un utilisateur de base de données associé à la connexion dans la base de données par défaut, soit un problème avec sa base de données par défaut.

Les problèmes d’autorisation peuvent être un ou plusieurs des éléments suivants :

  • La connexion n’a pas d’utilisateur mappé correspondant dans sa base de données par défaut.
  • Vous avez affecté une base de données par défaut à la connexion, mais vous n’avez pas créé de mappage d’utilisateur dans la base de données spécifiée.
  • L’utilisateur mappé pour la connexion a été refusé. (Par exemple, cela peut se produire si l’utilisateur est ajouté par inadvertance à un rôle de base de données fixe db_denydatareader .)

La base de données par défaut peut être indisponible au moment de la connexion pour les raisons suivantes :

  • La base de données par défaut est en mode suspect.
  • La base de données par défaut n’existe plus.
  • Le nom de la base de données par défaut n’est pas correct.
  • La base de données par défaut est en mode mono-utilisateur et la seule connexion disponible est déjà utilisée par quelqu’un ou autre chose.
  • La base de données par défaut a été détachée.
  • La base de données par défaut est définie sur un état RESTRICTED_USER.
  • La base de données par défaut est hors connexion.
  • La base de données par défaut est définie sur un état EMERGENCY.
  • La base de données par défaut fait partie d’un miroir de bases de données.

En outre, le compte de connexion peut être membre de plusieurs groupes, et la base de données par défaut de l’un de ces groupes n’est pas disponible au moment de la connexion.

Pour plus d’informations sur les utilisateurs de base de données dans SQL Server, consultez Créer un utilisateur de base de données.

Action utilisateur

Vous pouvez effectuer l’une des actions suivantes :

Contourner le problème

Si vous n’avez pas besoin d’accéder à la base de données par défaut actuellement configurée et que vous devez simplement vous connecter à l’instance SQL Server pour d’autres opérations à l’aide de SQL Server Management Studio (SSMS), procédez comme suit :

  1. Ouvrez SQL Server Management Studio (SSMS).

  2. Dans l’Explorateur d’objets, sélectionnez Se connecter> Moteur de base de données.

  3. Renseignez la boîte de dialogue Se connecter au serveur .

  4. Cliquez sur Options.

  5. Sous Propriétés de connexion, modifiez la valeur se connecter à la base de données à l’aide de l’une des options suivantes :

    • Si la connexion est membre du rôle sysadmin, entrez master, puis sélectionnez Se connecter pour établir une connexion à SQL Server. Une fois que vous êtes connecté à SQL Server, vous pouvez modifier votre base de données par défaut en une autre qui est actuellement disponible dans la page Général des propriétés de connexion dans SSMS. Pour plus d’informations, consultez Créer un compte de connexion.

    • Si la connexion n’est pas membre du rôle sysadmin, entrez un nom de base de données sur le serveur auquel vous savez que vous avez accès. Vous pouvez également essayer d’entrer un nom de base de données système, par master exemple, puis sélectionner Se connecter. Cette étape peut ne pas fonctionner si votre administrateur système a refusé explicitement des autorisations à un utilisateur invité dans la master base de données. Dans ce scénario, vous devez travailler avec votre administrateur système pour résoudre le problème.

Résoudre le problème

Un administrateur système peut vérifier la base de données par défaut actuelle de l’utilisateur à l’aide de la requête suivante :

SELECT name, default_database_name
FROM sys.server_principals
WHERE type = 'S' AND name = '<sql-login>';

Utilisez le tableau suivant pour déterminer l’action appropriée pour résoudre le problème pour les causes associées :

Cause Résolution
Aucun mappage d’utilisateur n’existe dans la base de données par défaut de la connexion ou l’utilisateur n’a pas été autorisé à accéder. Ces utilisateurs de base de données sont également appelés utilisateurs orphelins. Ce problème se produit généralement lorsque les bases de données sont déplacées entre deux instances de serveur et est l’une des causes courantes de l’erreur 4064. Pour détecter les utilisateurs orphelins et résoudre le problème, consultez Résoudre les problèmes liés aux utilisateurs orphelins (SQL Server).
Aucun utilisateur de base de données n’existe pour la connexion Créez un utilisateur de base de données et attribuez des autorisations pertinentes pour accéder à la base de données.
Compte d’utilisateur de base de données refusé des autorisations pour accéder à la base de données Accédez aux propriétés utilisateur de la base de données (Développer les utilisateurs de sécurité>du nœud >de base de données) et vérifiez si l’utilisateur fait partie de db_denydatareader rôle dans la page Appartenance. Vous pouvez également vérifier les autorisations effectives d’un utilisateur à l’aide de sys.fn_my_permissions.
La base de données par défaut est en mode suspect. Une base de données peut devenir suspecte pour plusieurs raisons. Les causes possibles incluent le refus d’accès à une ressource de base de données par le système d’exploitation et l’indisponibilité ou l’altération d’un ou plusieurs fichiers de base de données. Vous pouvez vérifier l’état de la base de données à l’aide de cette requête : SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';. Dans SSMS, l’état des bases de données suspectes s’affiche comme (Récupération en attente). Vous devrez peut-être récupérer la base de données à partir de sa sauvegarde pour résoudre cette situation.
Nom de base de données incorrect dans chaîne de connexion Lorsque vous tentez de vous connecter à une base de données qui n’existe pas, le message d’erreur suivant peut s’afficher :
Cannot open database "AdventureWorks" requested by the login. The login failed.
Le système de gestion de base de données (SGBD) peut également afficher le Login failed for user CONTOSO\user1 message d’erreur. Pour plus d’informations, consultez MSSQLSERVER_18456.
Le journal des erreurs SQL Server aura le message suivant :
« Échec de la connexion pour l’utilisateur « CONTOSO\User1 ». Motif : Échec de l’ouverture de la base de données explicitement spécifiée « AdventureWorks ».
Pour résoudre cette erreur, vérifiez que le nom de la base de données est identique dans le message d’erreur et l’entrée du journal des erreurs. Modifiez le chaîne de connexion s’il est incorrect ou accordez à l’utilisateur les autorisations requises.
La base de données par défaut n’existe plus. Si vous avez intentionnellement supprimé la base de données du serveur, modifiez la base de données par défaut pour la connexion à une autre base de données existante sur le serveur à l’aide de SSMS ou d’une instruction ALTER LOGIN (Transact-SQL). Si vous le souhaitez, vous pouvez vérifier s’il existe d’autres connexions sur le serveur dont la base de données par défaut est définie sur cette base de données non existante à l’aide de cette requête : SELECT name AS Login_Name FROM sys.server_principals where default_database_name = '<removed-dbname>';.
La base de données par défaut est en mode mono-utilisateur et la seule connexion est utilisée par l’administrateur ou une autre personne. Si la base de données est définie sur le mode mono-utilisateur à des fins de maintenance, vous devez la définir sur le mode multi-utilisateur après l’achèvement de l’activité de maintenance, à l’aide de cette requête : ALTER DATABASE <dbname> SET MULTI_USER;.
Pour plus d’informations, consultez Définir une base de données en mode mono-utilisateur.
Remarque : Pour vérifier si une base de données est en mode mono-utilisateur, vous pouvez utiliser cette requête : SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.
Si vous avez toujours besoin de restreindre l’accès à la base de données, mais que vous souhaitez activer la connectivité pour les connexions affectées, remplacez leur base de données par défaut par une autre base de données sur le serveur.
La base de données par défaut a été détachée. Détacher une base de données la supprime de l’instance de SQL Server et n’est plus accessible. Pour le rendre disponible pour les connexions, attachez la base de données à l’aide de SSMS ou d’une procédure stockée sp_attach_db . Pour plus d'informations, consultez Détachement et attachement de la base de données (SQL Server).
La base de données par défaut a été définie sur un état RESTRICTED_USER. Lorsqu’une base de données est définie sur un état RESTRICTED_USER, seuls les membres du rôle de base de données fixe db_owner et des rôles de serveur fixe sysadmin et dbcreator peuvent se connecter à la base de données. Si vous n’avez plus besoin de restreindre l’accès à la base de données correspondante, définissez la base de données sur le mode multi-utilisateur à l’aide de cette requête : ALTER DATABASE <dbname> SET MULTI_USER;.
Remarque : Pour vérifier si une base de données est dans un état restreint-utilisateur, vous pouvez utiliser cette requête : SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.
Si vous avez toujours besoin de restreindre l’accès à la base de données, mais que vous souhaitez activer la connectivité pour les connexions affectées, remplacez leur base de données par défaut par une autre base de données sur le serveur.
La base de données par défaut est hors connexion. Impossible de modifier une base de données dans l’état hors connexion. Vous pouvez mettre votre base de données en ligne à l’aide de cette requête : ALTER database <dnname> SET ONLINE;.
Vous pouvez vérifier si une base de données est HORS CONNEXION à l’aide de SSMS ou à l’aide de cette requête : SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.
Pour plus d’informations, consultez États de base de données et OPTIONS ALTER DATABASE SET (Transact-SQL) - SQL Server.
Si vous devez toujours conserver la base de données dans un état hors connexion, mais que vous souhaitez activer la connectivité pour les connexions affectées, remplacez leur base de données par défaut par une autre base de données sur le serveur.
La base de données par défaut est définie sur un état EMERGENCY. Une base de données a peut-être été placée dans un état d’urgence pour la résolution des problèmes par un administrateur système. Seuls les utilisateurs du rôle sysadmin peuvent accéder aux bases de données définies sur un état EMERGENCY. Vous pouvez mettre votre base de données en ligne à l’aide de cette requête : ALTER database <dnname> SET ONLINE;.
Vous pouvez vérifier si une base de données est dans un état d’urgence à l’aide de SSMS ou de cette requête : SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.
Pour plus d’informations, consultez États de base de données et Options ALTER DATABASE SET (Transact-SQL).
Si vous devez toujours conserver la base de données dans un état d’urgence, mais que vous souhaitez activer la connectivité pour les connexions affectées, remplacez leur base de données par défaut par une autre base de données sur le serveur.
La base de données par défaut fait partie du miroir de bases de données. Vous ne pouvez pas vous connecter à une base de données miroir sur le serveur miroir, et ce comportement est par conception. Pour vérifier si la base de données est actuellement en miroir, utilisez cette requête SELECT DB_NAME(database_id) as database_name, mirroring_role_desc FROM sys.database_mirroring WHERE DB_NAME(database_id) = '<dbname>';. Pour plus d’informations sur la mise en miroir de bases de données, consultez Mise en miroir de bases de données (SQL Server).
Le compte de connexion peut être membre de plusieurs groupes, et la base de données par défaut de l’un des groupes n’est pas disponible au moment de la connexion. Pour énumérer les groupes qui ont un utilisateur spécifié à l’aide de PowerShell, consultez Get-ADPrincipalGroupMembership (ActiveDirectory).

Modifier la base de données par défaut pour un utilisateur donné

Pour apporter des modifications à la base de données par défaut d’un utilisateur, vous devez disposer de l’autorisation ALTER ANY LOGIN. Si la connexion modifiée est membre du rôle serveur fixe sysadmin ou d’un bénéficiaire de l’autorisation CONTROL SERVER, elle nécessite également l’autorisation CONTROL SERVER lors des modifications suivantes. Les membres du rôle sysadmin ont ces autorisations activées par défaut. Pour plus d’informations, consultez ALTER LOGIN (Transact-SQL).

Modifier la base de données par défaut à l’aide de SSMS

  1. Connectez-vous à votre instance SQL Server à l’aide de SQL Server Management Studio (SSMS).

  2. Sélectionnez Connexions de sécurité>pour localiser l’utilisateur et modifier la base de données par défaut de l’utilisateur en une autre qui est actuellement disponible dans la page Général des propriétés de connexion dans SSMS. Pour plus d’informations, consultez Créer un compte de connexion.

  3. Après vous être connecté à l’instance SQL Server, vous pouvez exécuter une ALTER LOGIN instruction, comme les exemples suivants :

    ALTER LOGIN <LoginName> WITH DEFAULT_DATABASE = <AvailableDatabaseName>;

    <AvailableDatabaseName> est un espace réservé pour le nom de la base de données existante accessible par la connexion SQL Server dans l’instance. <LoginName> est un espace réservé pour la connexion SQL Server avec les autorisations nécessaires ALTER LOGIN .

    Par exemple :

    ALTER LOGIN [SQLLogin] WITH DEFAULT_DATABASE = master;
    ALTER LOGIN [Constoso\Windowslogin] WITH DEFAULT_DATABASE = [AdventureWorks];
    

L’erreur 18456 s’affiche avec l’erreur 4064

Lorsque vous utilisez des applications telles que SSMS qui obtiennent l’erreur 4064 affichée à l’utilisateur, le message suivant est enregistré dans le journal des erreurs SQL Server. Ce comportement est normal. Correction de la base de données par défaut pour la connexion ayant échoué, à l’aide des procédures documentées dans cet article, traite automatiquement l’erreur 18456.

2023-02-06 18:17:02.56 Logon       Error: 18456, Severity: 14, State: 40.
2023-02-06 18:17:02.56 Logon       Login failed for user '<user name>. Reason: Failed to open the database '<db_name>' specified in the login properties. [CLIENT: <hostname >]