MSSQLSERVER_4064

Se aplica a:SQL Server

Detalles

Attribute Value
Nombre del producto SQL Server
Id. de evento 4064
Origen del evento MSSQLSERVER
Componente SQLEngine
Nombre simbólico DB_UFAIL_FATAL
Texto del mensaje No se puede abrir la base de datos predeterminada del usuario. Error de inicio de sesión.

Explicación

El inicio de sesión de SQL Server no pudo conectarse a SQL Server, ya sea debido a problemas de permisos con un usuario de base de datos asociado al inicio de sesión en la base de datos predeterminada o a un problema con su base de datos predeterminada.

Los problemas de permisos pueden ser uno o varios de los siguientes:

  • El inicio de sesión no tiene un usuario asignado correspondiente en su base de datos predeterminada.
  • Asignó una base de datos predeterminada al inicio de sesión, pero no creó una asignación de usuario en la base de datos especificada.
  • Se ha denegado el acceso al usuario asignado para el inicio de sesión. (Por ejemplo, esto puede ocurrir si el usuario se agrega accidentalmente a un rol fijo de base de datos de db_denydatareader ).

La base de datos predeterminada puede no estar disponible en el momento de la conexión por los siguientes motivos:

  • La base de datos predeterminada está en modo sospechoso.
  • La base de datos predeterminada ya no existe.
  • El nombre de la base de datos predeterminado no es correcto.
  • La base de datos predeterminada está en modo de usuario único y la única conexión disponible ya la usa alguien o algo más.
  • La base de datos predeterminada se ha desasociado.
  • La base de datos predeterminada se establece en un estado de RESTRICTED_USER.
  • La base de datos predeterminada está sin conexión.
  • La base de datos predeterminada se establece en un estado EMERGENCY.
  • La base de datos predeterminada forma parte de un reflejo de la base de datos.

Además, la cuenta de inicio de sesión puede ser miembro de varios grupos y la base de datos predeterminada para uno de esos grupos no está disponible en el momento de la conexión.

Para obtener más información sobre los usuarios de bases de datos en SQL Server, vea Crear un usuario de base de datos.

Acción del usuario

Puede realizar una de las siguientes acciones:

Solución del problema

Si no necesita acceder a la base de datos predeterminada configurada actualmente y solo tiene que conectarse a la instancia de SQL Server para otras operaciones mediante SQL Server Management Studio (SSMS), siga estos pasos:

  1. Abra SQL Server Management Studio (SSMS).

  2. En Explorador de objetos, seleccione Conectar> Motor de base de datos.

  3. Rellene el cuadro de diálogo Conectar al servidor.

  4. Seleccione Opciones.

  5. En propiedades de Conectar ion, modifique el valor de Conectar a la base de datos mediante una de las siguientes opciones:

    • Si el inicio de sesión es miembro del rol sysadmin, escriba mastery seleccione Conectar para establecer una conexión a SQL Server. Una vez que se haya conectado correctamente a SQL Server, puede cambiar la base de datos predeterminada a otra que esté disponible actualmente en la página General de las propiedades del inicio de sesión en SSMS. Para obtener más información, vea Crear un inicio de sesión.

    • Si el inicio de sesión no es miembro del rol sysadmin, escriba un nombre de base de datos en el servidor al que sabe que tiene acceso. Como alternativa, puede intentar escribir un nombre de base de datos del sistema como master y, a continuación, seleccionar Conectar. Es posible que este paso no funcione si el administrador del sistema ha denegado explícitamente permisos a un usuario invitado en la master base de datos. En ese escenario, debe trabajar con el administrador del sistema para resolver el problema.

Corrección del problema

Un administrador del sistema puede comprobar cuál es la base de datos predeterminada actual del usuario mediante la siguiente consulta:

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

Use la tabla siguiente para determinar la acción adecuada para corregir el problema para las causas asociadas:

Causa Solución
No existe ninguna asignación de usuario en la base de datos predeterminada del inicio de sesión o se ha denegado el acceso al usuario. Estos usuarios de base de datos también se conocen como usuarios huérfanos. Este problema suele producirse cuando las bases de datos se mueven entre dos instancias de servidor y es una de las causas comunes del error 4064. Para detectar usuarios huérfanos y resolver el problema, consulte Solución de problemas de usuarios huérfanos (SQL Server).
No existe ningún usuario de base de datos para el inicio de sesión Cree un usuario de base de datos y asigne permisos pertinentes para acceder a la base de datos.
Permisos denegados de la cuenta de usuario de la base de datos para acceder a la base de datos Vaya a las propiedades de usuario de la base de datos (expanda usuarios de seguridad>del nodo> de base de datos) y compruebe si el usuario forma parte de db_denydatareader rol en la página Pertenencia. También puede comprobar los permisos efectivos de un usuario mediante sys.fn_my_permissions.
La base de datos predeterminada está en modo sospechoso. Una base de datos puede ser sospechosa por varios motivos. Entre las posibles causas se incluyen la denegación de acceso a un recurso de base de datos por parte del sistema operativo y la falta de disponibilidad o daños de uno o varios archivos de base de datos. Puede comprobar el estado de la base de datos mediante esta consulta: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';. En SSMS, el estado de las bases de datos sospechosas se muestra como (Pendiente de recuperación). Es posible que tenga que recuperar la base de datos de su copia de seguridad para resolver esta situación.
Nombre de base de datos incorrecto en cadena de conexión Al intentar conectarse a una base de datos que no existe, es posible que vea el siguiente mensaje de error:
Cannot open database "AdventureWorks" requested by the login. The login failed.
El sistema de administración de bases de datos (DBMS) también puede mostrar el mensaje de Login failed for user CONTOSO\user1 error. Para obtener más información, consulte MSSQLSERVER_18456.
El registro de errores de SQL Server tendrá el siguiente mensaje:
"Error de inicio de sesión del usuario "CONTOSO\User1". Motivo: No se pudo abrir la base de datos especificada explícitamente "AdventureWorks".
Para resolver este error, asegúrese de que el nombre de la base de datos sea el mismo en el mensaje de error y en la entrada del registro de errores. Cambie el cadena de conexión si es incorrecto o conceda al usuario los permisos necesarios.
La base de datos predeterminada ya no existe. Si ha quitado intencionadamente la base de datos del servidor, cambie la base de datos predeterminada para el inicio de sesión a otra base de datos existente en el servidor mediante SSMS o una instrucción ALTER LOGIN (Transact-SQL). Opcionalmente, puede comprobar si hay otros inicios de sesión en el servidor cuya base de datos predeterminada está establecida en esta base de datos no existente mediante esta consulta: SELECT name AS Login_Name FROM sys.server_principals where default_database_name = '<removed-dbname>';.
La base de datos predeterminada está en modo de usuario único y el administrador o otra persona usan la única conexión. Si la base de datos se establece en modo de usuario único para fines de mantenimiento, debe volver a establecerla en modo multiusuario después de la finalización de la actividad de mantenimiento, mediante esta consulta: ALTER DATABASE <dbname> SET MULTI_USER;.
Para obtener más información, consulta Establecer una base de datos en modo de usuario único.
Nota: Para comprobar si una base de datos está en modo de usuario único, puede usar esta consulta: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.
Si todavía necesita restringir el acceso a la base de datos, pero desea habilitar la conectividad para los inicios de sesión afectados, cambie su base de datos predeterminada a otra base de datos en el servidor.
La base de datos predeterminada se ha desasociado. Desasociar una base de datos la quita de la instancia de SQL Server y ya no es accesible. Para que esté disponible para los inicios de sesión, adjunte la base de datos mediante SSMS o un procedimiento almacenado sp_attach_db . Para obtener más información, consulte Adjuntar y separar bases de datos (SQL Server).
La base de datos predeterminada se ha establecido en un estado de RESTRICTED_USER. Cuando una base de datos se establece en un estado de RESTRICTED_USER, solo los miembros del rol fijo de base de datos db_owner y los roles fijos de servidor dbcreator y sysadmin pueden conectarse a la base de datos. Si ya no necesita restringir el acceso a la base de datos correspondiente, establezca la base de datos en modo multiusuario mediante esta consulta: ALTER DATABASE <dbname> SET MULTI_USER;.
Nota: Para comprobar si una base de datos está en un estado de usuario restringido, puede usar esta consulta: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.
Si todavía necesita restringir el acceso a la base de datos, pero desea habilitar la conectividad para los inicios de sesión afectados, cambie su base de datos predeterminada a otra base de datos en el servidor.
La base de datos predeterminada está sin conexión. No se puede modificar una base de datos que esté en estado sin conexión. Puede poner la base de datos en línea mediante esta consulta: ALTER database <dnname> SET ONLINE;.
Puede comprobar si una base de datos está sin conexión mediante SSMS o mediante esta consulta: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.
Para obtener más información, vea Estados de base de datos y opciones alter DATABASE SET (Transact-SQL): SQL Server.
Si todavía necesita mantener la base de datos en un estado sin conexión, pero desea habilitar la conectividad para los inicios de sesión afectados, cambie su base de datos predeterminada a otra base de datos en el servidor.
La base de datos predeterminada se establece en un estado EMERGENCY. Es posible que un administrador del sistema haya puesto una base de datos en un estado DE EMERGENCIA para solucionar problemas. Solo los usuarios del rol sysadmin pueden tener acceso a las bases de datos establecidas en un estado EMERGENCY. Puede poner la base de datos en línea mediante esta consulta: ALTER database <dnname> SET ONLINE;.
Puede comprobar si una base de datos está en estado EMERGENCY mediante SSMS o esta consulta: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.
Para obtener más información, vea Estados de base de datos y opciones alter DATABASE SET (Transact-SQL).
Si todavía necesita mantener la base de datos en estado EMERGENCY, pero quiere habilitar la conectividad para los inicios de sesión afectados, cambie su base de datos predeterminada a otra base de datos en el servidor.
La base de datos predeterminada forma parte del reflejo de la base de datos. No se puede conectar a una base de datos reflejada en el servidor reflejado y este comportamiento es por diseño. Para comprobar si la base de datos está actualmente en el rol reflejado, use esta consulta SELECT DB_NAME(database_id) as database_name, mirroring_role_desc FROM sys.database_mirroring WHERE DB_NAME(database_id) = '<dbname>';. Para obtener más información sobre la creación de reflejo de la base de datos, vea Creación de reflejo de la base de datos (SQL Server).
La cuenta de inicio de sesión puede ser miembro de varios grupos y la base de datos predeterminada para uno de los grupos no está disponible en el momento de la conexión. Para enumerar los grupos que tienen un usuario especificado mediante PowerShell, consulte Get-ADPrincipalGroupMembership (ActiveDirectory).

Cambiar la base de datos predeterminada para un usuario determinado

Para realizar cambios en la base de datos predeterminada de un usuario, debe tener el permiso ALTER ANY LOGIN. Si el inicio de sesión que se va a cambiar es miembro del rol fijo de servidor sysadmin o de un receptor del permiso CONTROL SERVER, también requiere el permiso CONTROL SERVER al realizar los siguientes cambios. Los miembros del rol sysadmin tienen estos permisos habilitados de forma predeterminada. Para obtener más información, consulte ALTER LOGIN (Transact-SQL).

Cambio de la base de datos predeterminada mediante SSMS

  1. Conectar a la instancia de SQL Server mediante SQL Server Management Studio (SSMS).

  2. Seleccione Inicios de sesión de seguridad>para buscar el usuario y cambiar la base de datos predeterminada del usuario a otra que esté disponible actualmente en la página General de las propiedades del inicio de sesión en SSMS. Para obtener más información, vea Crear un inicio de sesión.

  3. Después de conectarse a la instancia de SQL Server, puede ejecutar una ALTER LOGIN instrucción, como los ejemplos siguientes:

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

    <AvailableDatabaseName> es un marcador de posición para el nombre de la base de datos existente a la que puede acceder el inicio de sesión de SQL Server en la instancia. <LoginName> es un marcador de posición para el inicio de sesión de SQL Server con los permisos necesarios ALTER LOGIN .

    Por ejemplo:

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

El error 18456 se muestra junto con el error 4064

Cuando se usan aplicaciones como SSMS que reciben el error 4064 que se muestra al usuario, se registra el siguiente mensaje en el registro de errores de SQL Server. Este comportamiento se debe al diseño. Corregir la base de datos predeterminada para el inicio de sesión con errores, con los procedimientos documentados en este artículo, soluciona automáticamente el error 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 >]