MSSQLSERVER_4064

适用于:SQL Server

详细信息

属性
产品名称 SQL Server
事件 ID 4064
事件来源 MSSQLSERVER
组件 SQLEngine
符号名称 DB_UFAIL_FATAL
消息正文 无法打开用户默认数据库。 登录失败。

说明

由于与默认数据库中登录名关联的数据库用户的权限问题或默认数据库存在问题,SQL Server 登录名无法连接到 SQL Server。

权限问题可以是以下一个或多个问题:

  • 该登录名在其默认数据库中没有相应的映射用户。
  • 已将默认数据库分配给登录名,但未在指定数据库中创建用户映射。
  • 登录名的映射用户被拒绝访问。 (例如,如果用户无意中被添加到 db_denydatareader 固定数据库角色,可能会发生这种情况。

由于以下原因,默认数据库在连接时可能不可用:

  • 默认数据库处于可疑模式。
  • 默认数据库不再存在。
  • 默认数据库名称不正确。
  • 默认数据库处于单用户模式,唯一可用的连接已由某人或其他内容使用。
  • 已分离默认数据库。
  • 默认数据库设置为RESTRICTED_USER状态。
  • 默认数据库处于脱机状态。
  • 默认数据库设置为 EMERGENCY 状态。
  • 默认数据库是数据库镜像的一部分。

此外,登录帐户可能是多个组的成员,并且其中一个组的默认数据库在连接时不可用。

有关 SQL Server 中的数据库用户的详细信息,请参阅 “创建数据库用户”。

用户操作

可以执行以下操作之一:

解决此问题

如果不需要访问当前配置的默认数据库,只需使用 SQL Server Management Studio(SSMS)连接到 SQL Server 实例进行其他操作,请执行以下步骤:

  1. 打开 SQL Server Management Studio (SSMS)。

  2. 对象资源管理器上,选择“连接>数据库引擎。

  3. 填写“ 连接到服务器 ”对话框。

  4. 选择“选项”。

  5. 在“连接属性”,使用以下选项之一修改“连接到数据库”值:

    • 如果登录名是 sysadmin 角色的成员,请输入 master并选择“ 连接” 以建立与 SQL Server 的连接。 成功连接到 SQL Server 后,可以将默认数据库更改为当前在 SSMS 中登录属性的“常规”页中可用的其他数据库。 有关详细信息,请参阅 创建登录名

    • 如果登录名不是 sysadmin 角色的成员,请在知道你有权访问的服务器上输入数据库名称。 或者,可以尝试输入系统数据库名称,然后选择 master连接”。 如果系统管理员已显式拒绝对数据库中来宾用户 master 的权限,则此步骤可能不起作用。 在这种情况下,需要与系统管理员合作来解决此问题。

解决问题

系统管理员可以使用以下查询检查用户当前默认数据库是什么:

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

使用下表确定用于修复相关原因问题的相应操作:

原因 解决方法
登录名的默认数据库中不存在用户映射,或者用户被拒绝访问。 这些数据库用户也称为孤立用户。 当数据库在两个服务器实例之间移动并且是 4064 错误的常见原因之一时,通常会发生此问题。 若要检测孤立用户并解决问题,请参阅 对孤立用户(SQL Server)进行故障排除。
登录名不存在数据库用户 创建数据库用户 并分配访问数据库的相关权限。
数据库用户帐户拒绝访问数据库的权限 导航到数据库中的用户属性(展开数据库节点>安全>用户),并检查用户是否是成员身份页中db_denydatareader角色的一部分。 还可以使用 sys.fn_my_permissions检查用户的有效权限。
默认数据库处于可疑模式。 数据库可能由于某些原因而变得可疑。 可能的原因包括操作系统拒绝访问数据库资源,以及一个或多个数据库文件的不可用或损坏。 可以使用此查询检查数据库的状态: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';。 在 SSMS 中,可疑数据库的状态显示为(恢复挂起)。 可能需要从其备份中恢复数据库才能解决此问题。
连接字符串中的数据库名称不正确 尝试连接到不存在的数据库时,可能会看到以下错误消息:
Cannot open database "AdventureWorks" requested by the login. The login failed.
数据库管理系统(DBMS)也可能显示 Login failed for user CONTOSO\user1 错误消息。 有关详细信息,请参阅 MSSQLSERVER_18456
SQL Server 错误日志将包含以下消息:
“用户”CONTOSO\User1“登录失败。 原因:无法打开显式指定的数据库“AdventureWorks”。
若要解决此错误,请确保错误消息和错误日志条目中的数据库名称相同。 更改连接字符串(如果不正确)或向用户授予所需的权限。
默认数据库不再存在。 如果有意从服务器中删除数据库,请使用 SSMS 或 ALTER LOGIN (Transact-SQL) 语句将登录名的默认数据库更改为服务器上的另一个现有数据库。 (可选)你可能想要检查服务器上是否有其他登录名,其默认数据库已使用此查询将此非现有数据库设置为此数据库: SELECT name AS Login_Name FROM sys.server_principals where default_database_name = '<removed-dbname>';
默认数据库处于单用户模式,管理员或其他人仅使用连接。 如果数据库设置为单用户模式以进行维护,则应在完成维护活动后将其重新设置为多用户模式,使用此查询: ALTER DATABASE <dbname> SET MULTI_USER;
有关更多信息,请参阅“将数据库设置为单用户模式”。
注意:若要检查数据库是否处于单用户模式,可以使用以下查询: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';
如果仍需要限制对数据库的访问,但想要为受影响的登录名启用连接,请将其默认数据库更改为服务器上的其他数据库。
已分离默认数据库。 分离数据库会将其从 SQL Server 实例中删除,并且不再可访问。 若要使其可用于登录,请使用 SSMS 或 sp_attach_db 存储过程附加数据库。 有关详细信息,请参阅数据库分离和附加 (SQL Server)
默认数据库已设置为RESTRICTED_USER状态。 当数据库设置为RESTRICTED_USER状态时,只有db_owner固定数据库角色和 dbcreator 和 sysadmin 固定服务器角色的成员才能连接到数据库。 如果不再需要限制对相应数据库的访问,请使用以下查询将数据库设置为多用户模式: ALTER DATABASE <dbname> SET MULTI_USER;
注意:若要检查数据库是否处于受限用户状态,可以使用以下查询: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';
如果仍需要限制对数据库的访问,但想要为受影响的登录名启用连接,请将其默认数据库更改为服务器上的其他数据库。
默认数据库处于脱机状态。 无法修改处于脱机状态的数据库。 可以使用以下查询使数据库联机: ALTER database <dnname> SET ONLINE;
可以使用 SSMS 检查数据库是否为 OFFLINE,或者使用此查询: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';
有关详细信息,请参阅 数据库状态ALTER DATABASE SET 选项 (Transact-SQL) - SQL Server
如果仍需要使数据库处于脱机状态,但想要为受影响的登录名启用连接,请将其默认数据库更改为服务器上的其他数据库。
默认数据库设置为 EMERGENCY 状态。 数据库可能已进入紧急状态,以便系统管理员进行故障排除。 只有 sysadmin 角色的用户才能访问设置为 EMERGENCY 状态的数据库。 可以使用以下查询使数据库联机: ALTER database <dnname> SET ONLINE;
可以使用 SSMS 检查数据库是否处于紧急状态,或者此查询: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';
有关详细信息,请参阅数据库状态ALTER DATABASE SET 选项(Transact-SQL)。
如果仍需要使数据库保持紧急状态,但想要为受影响的登录名启用连接,请将其默认数据库更改为服务器上的其他数据库。
默认数据库是数据库镜像的一部分。 无法连接到镜像服务器上的镜像数据库,此行为是设计使然。 若要检查数据库当前是否处于镜像角色,请使用此查询 SELECT DB_NAME(database_id) as database_name, mirroring_role_desc FROM sys.database_mirroring WHERE DB_NAME(database_id) = '<dbname>';。 有关数据库镜像的详细信息,请参阅数据库镜像 (SQL Server)
登录帐户可能是多个组的成员,其中一个组的默认数据库在连接时不可用。 若要使用 PowerShell 枚举具有指定用户的组,请参阅 Get-ADPrincipalGroupMembership (ActiveDirectory)。

更改给定用户的默认数据库

若要更改用户的默认数据库,需要具有 ALTER ANY LOGIN 权限。 如果所更改的登录名是 sysadmin 固定服务器角色的成员或 CONTROL SERVER 权限的被授权者,则进行以下更改时也需要 CONTROL SERVER 权限。 默认情况下,sysadmin 角色的成员已启用这些权限。 有关详细信息,请参阅 ALTER LOGIN (Transact-SQL)。

使用 SSMS 更改默认数据库

  1. 使用 SQL Server Management Studio 连接到 SQL Server 实例(SSMS)。

  2. 选择“安全>登录名”以找到用户,并将用户的默认数据库更改为 SSMS 中登录属性的“常规”页中当前可用的其他数据库。 有关详细信息,请参阅 创建登录名

  3. 连接到 SQL Server 实例后,可以执行语句 ALTER LOGIN ,如以下示例所示:

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

    <AvailableDatabaseName> 是实例中 SQL Server 登录名可访问的现有数据库名称的占位符。 <LoginName> 是具有必要 ALTER LOGIN 权限的 SQL Server 登录名的占位符。

    例如:

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

显示错误 18456 以及错误 4064

使用 SSMS 等应用程序向用户显示错误 4064 时,SQL Server 错误日志中记录了以下消息。 此行为是设计使然。 使用本文中所述的过程修复失败登录的默认数据库会自动解决 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 >]