MSSQLSERVER_4064

Aplica-se a: SQL Server

Detalhes

Atributo Valor
Nome do produto SQL Server
ID do evento 4064
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico DB_UFAIL_FATAL
Texto da mensagem Não é possível abrir o banco de dados padrão do usuário. Falha no logon.

Explicação

O logon do SQL Server não pôde se conectar ao SQL Server, devido a problemas de permissão com um usuário de banco de dados associado ao logon no banco de dados padrão ou a um problema com seu banco de dados padrão.

Os problemas de permissão podem ser um ou mais dos seguintes:

  • O logon não tem um usuário mapeado correspondente em seu banco de dados padrão.
  • Você atribuiu um banco de dados padrão ao logon, mas não criou um mapeamento de usuário no banco de dados especificado.
  • O usuário mapeado para o logon teve o acesso negado. (Por exemplo, isso pode acontecer se o usuário for adicionado inadvertidamente a uma função de banco de dados fixa db_denydatareader .)

O banco de dados padrão pode estar indisponível no momento da conexão pelos seguintes motivos:

  • O banco de dados padrão está no modo suspeito.
  • O banco de dados padrão não existe mais.
  • O nome do banco de dados padrão não está correto.
  • O banco de dados padrão está no modo de usuário único e a única conexão disponível já é usada por alguém ou outra coisa.
  • O banco de dados padrão foi desanexado.
  • O banco de dados padrão é definido como um estado RESTRICTED_USER.
  • O banco de dados padrão está offline.
  • O banco de dados padrão é definido como um estado EMERGENCY.
  • O banco de dados padrão faz parte de um espelho de banco de dados.

Além disso, a conta de logon pode ser membro de vários grupos e o banco de dados padrão de um desses grupos não está disponível no momento da conexão.

Para obter mais informações sobre usuários de banco de dados no SQL Server, consulte Criar um usuário de banco de dados.

Ação do usuário

Você pode executar uma das seguintes ações:

Trabalhe em torno do problema

Se você não precisar acessar o banco de dados padrão configurado no momento e precisar apenas se conectar à instância do SQL Server para outras operações usando o SSMS (SQL Server Management Studio), siga estas etapas:

  1. Abra o SQL Server Management Studio (SSMS).

  2. No Pesquisador de Objetos, selecione Conectar>Mecanismo de Banco de Dados.

  3. Preencha a caixa de diálogo Conectar ao servidor .

  4. Selecione Opções.

  5. Em Propriedades de conexão, modifique o valor Conectar ao banco de dados usando uma das seguintes opções:

    • Se o logon for membro da função sysadmin, insira mastere selecione Conectar para estabelecer uma conexão com o SQL Server. Depois de se conectar com êxito ao SQL Server, você poderá alterar seu banco de dados padrão para um diferente que esteja disponível no momento na página Geral das propriedades de logon no SSMS. Para obter mais informações, consulte Crie um logon.

    • Se o logon não for membro da função sysadmin, insira um nome de banco de dados no servidor ao qual você sabe que tem acesso. Como alternativa, você pode tentar inserir um nome de banco de dados do sistema como master e selecionar Conectar. Essa etapa pode não funcionar se o master administrador do sistema tiver negado explicitamente permissões a um usuário convidado no banco de dados. Nesse cenário, você precisa trabalhar com o administrador do sistema para resolver o problema.

Corrigir o problema

Um administrador do sistema pode verificar qual é o banco de dados padrão atual do usuário, usando a seguinte consulta:

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

Use a tabela a seguir para determinar a ação apropriada para corrigir o problema de causas associadas:

Causa Solução
Não existe mapeamento de usuário no banco de dados padrão do logon ou o acesso foi negado ao usuário. Esses usuários do banco de dados também são chamados de usuários órfãos. Esse problema geralmente ocorre quando os bancos de dados são movidos entre duas instâncias do servidor e é uma das causas comuns do erro 4064. Para detectar usuários órfãos e resolver o problema, consulte Solucionar problemas de usuários órfãos (SQL Server).
Não existe nenhum usuário de banco de dados para o logon Crie um usuário de banco de dados e atribua permissões relevantes para acessar o banco de dados.
Conta de usuário do banco de dados com permissões negadas para acessar o banco de dados Navegue até as propriedades do usuário no banco de dados (Expandir usuários de segurança>do nó do banco de> dados) e verifique se o usuário faz parte de db_denydatareader função na página Associação. Você também pode verificar as permissões efetivas de um usuário usando sys.fn_my_permissions.
O banco de dados padrão está no modo suspeito. Um banco de dados pode se tornar suspeito por vários motivos. As possíveis causas incluem a negação de acesso a um recurso de banco de dados pelo sistema operacional e a indisponibilidade ou corrupção de um ou mais arquivos de banco de dados. Você pode verificar o estado do banco de dados usando esta consulta: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';. No SSMS, o status dos bancos de dados suspeitos é mostrado como (Recuperação pendente). Talvez seja necessário recuperar o banco de dados de seu backup para resolver essa situação.
Nome de banco de dados incorreto na cadeia de conexão Ao tentar se conectar a um banco de dados que não existe, você pode ver a seguinte mensagem de erro:
Cannot open database "AdventureWorks" requested by the login. The login failed.
O sistema de gerenciamento de banco de dados (DBMS) também pode mostrar a mensagem de Login failed for user CONTOSO\user1 erro. Para obter mais informações, consulte MSSQLSERVER_18456.
O log de erros do SQL Server terá a seguinte mensagem:
"Falha no logon para o usuário 'CONTOSO\User1'. Motivo: Falha ao abrir o banco de dados explicitamente especificado 'AdventureWorks'."
Para resolver esse erro, certifique-se de que o nome do banco de dados seja o mesmo na mensagem de erro e na entrada do log de erros. Altere a cadeia de conexão se ela estiver incorreta ou conceda ao usuário as permissões necessárias.
O banco de dados padrão não existe mais. Se você removeu intencionalmente o banco de dados do servidor, altere o banco de dados padrão para o logon em outro banco de dados existente no servidor usando o SSMS ou uma instrução ALTER LOGIN (Transact-SQL). Opcionalmente, você pode querer verificar se há outros logons no servidor cujo banco de dados padrão está definido para esse banco de dados inexistente usando esta consulta: SELECT name AS Login_Name FROM sys.server_principals where default_database_name = '<removed-dbname>';.
O banco de dados padrão está em um modo de usuário único e a única conexão está sendo usada pelo administrador ou por outra pessoa. Se o banco de dados estiver definido para o modo de usuário único para fins de manutenção, você deverá defini-lo novamente para o modo multiusuário após a conclusão da atividade de manutenção, usando esta consulta: ALTER DATABASE <dbname> SET MULTI_USER;.
Veja mais informações em Definir um banco de dados como modo de usuário único.
Observação: para verificar se um banco de dados está no modo de usuário único, você pode usar esta consulta: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.
Se você ainda precisar restringir o acesso ao banco de dados, mas quiser habilitar a conectividade para os logons afetados, altere o banco de dados padrão para um banco de dados diferente no servidor.
O banco de dados padrão foi desanexado. Desanexar um banco de dados o remove da instância do SQL Server e não pode mais ser acessado. Para disponibilizá-lo para logons, anexe o banco de dados usando o SSMS ou um procedimento armazenado sp_attach_db . Para obter mais informações, confira Anexar e desanexar bancos de dados (SQL Server).
O banco de dados padrão foi definido para um estado RESTRICTED_USER. Quando um banco de dados é definido como um estado RESTRICTED_USER, somente os membros da função de banco de dados fixa db_owner e das funções de servidor fixas dbcreator e sysadmin podem se conectar ao banco de dados. Se você não precisar mais restringir o acesso ao banco de dados correspondente, defina o banco de dados para o modo multiusuário usando esta consulta: ALTER DATABASE <dbname> SET MULTI_USER;.
Observação: Para verificar se um banco de dados está em um estado de usuário restrito, você pode usar esta consulta: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.
Se você ainda precisar restringir o acesso ao banco de dados, mas quiser habilitar a conectividade para os logons afetados, altere o banco de dados padrão para um banco de dados diferente no servidor.
O banco de dados padrão está offline. Um banco de dados que está no estado offline não pode ser modificado. Você pode colocar seu banco de dados online usando esta consulta: ALTER database <dnname> SET ONLINE;.
Você pode verificar se um banco de dados está OFFLINE usando o SSMS ou usando esta consulta: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.
Para obter mais informações, consulte Estados do banco de dados e Opções ALTER DATABASE SET (Transact-SQL) – SQL Server.
Se você ainda precisar manter o banco de dados em um estado offline, mas quiser habilitar a conectividade para os logons afetados, altere o banco de dados padrão para um banco de dados diferente no servidor.
O banco de dados padrão é definido como um estado EMERGENCY. Um banco de dados pode ter sido colocado em um estado EMERGENCY para solução de problemas por um administrador do sistema. Somente usuários da função sysadmin podem acessar bancos de dados definidos para um estado EMERGENCY. Você pode colocar seu banco de dados online usando esta consulta: ALTER database <dnname> SET ONLINE;.
Você pode verificar se um banco de dados está em um estado EMERGENCY usando o SSMS ou esta consulta: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.
Para obter mais informações, consulte Estados do banco de dados e Opções ALTER DATABASE SET (Transact-SQL).
Se você ainda precisar manter o banco de dados em um estado EMERGENCY, mas quiser habilitar a conectividade para os logons afetados, altere o banco de dados padrão para um banco de dados diferente no servidor.
O banco de dados padrão faz parte do espelho do banco de dados. Você não pode se conectar a um banco de dados espelho no servidor espelho e esse comportamento é por design. Para verificar se o banco de dados está atualmente na função de espelho, 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 obter mais informações sobre o espelhamento de banco de dados, consulte Espelhamento de banco de dados (SQL Server).
A conta de logon pode ser membro de vários grupos e o banco de dados padrão de um dos grupos não está disponível no momento da conexão. Para enumerar os grupos que têm um usuário especificado usando o PowerShell, consulte Get-ADPrincipalGroupMembership (ActiveDirectory).

Alterar o banco de dados padrão para um determinado usuário

Para fazer alterações no banco de dados padrão de um usuário, você precisa ter a permissão ALTER ANY LOGIN. Se o logon que está sendo alterado for um membro da função de servidor fixa sysadmin ou um beneficiário da permissão CONTROL SERVER, ele também exigirá a permissão CONTROL SERVER ao fazer as alterações a seguir. Os membros da função sysadmin têm essas permissões habilitadas por padrão. Para obter mais informações, consulte ALTER LOGIN (Transact-SQL).

Alterar o banco de dados padrão usando o SSMS

  1. Conecte-se à sua instância do SQL Server usando o SSMS (SQL Server Management Studio).

  2. Selecione Logons de Segurança>para localizar o usuário e alterar o banco de dados padrão do usuário para um diferente que esteja disponível no momento na página Geral das propriedades de logon no SSMS. Para obter mais informações, consulte Crie um logon.

  3. Depois de se conectar à instância do SQL Server, você pode executar uma ALTER LOGIN instrução, como os exemplos a seguir:

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

    <AvailableDatabaseName> é um espaço reservado para o nome do banco de dados existente que pode ser acessado pelo logon do SQL Server na instância. <LoginName> é um espaço reservado para o logon do SQL Server com as permissões necessárias ALTER LOGIN .

    Por exemplo:

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

O erro 18456 é exibido junto com o erro 4064

Ao usar aplicativos como o SSMS que recebem o erro 4064 exibido para o usuário, a mensagem a seguir é registrada no log de erros do SQL Server. Esse comportamento é por design. Corrigir o banco de dados padrão para o logon com falha, usando os procedimentos documentados neste artigo, aborda automaticamente o erro 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 >]