MSSQLSERVER_4064

Si applica a: SQL Server

Dettagli

Attributo valore
Nome prodotto SQL Server
ID evento 4064
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico DB_UFAIL_FATAL
Testo del messaggio Impossibile aprire il database utente predefinito. Accesso non riuscito.

Spiegazione

L'account di accesso di SQL Server non è riuscito a connettersi a SQL Server, a causa di problemi di autorizzazione con un utente del database associato all'account di accesso nel database predefinito o di un problema con il database predefinito.

I problemi di autorizzazione possono essere uno o più dei seguenti:

  • L'account di accesso non ha un utente mappato corrispondente nel database predefinito.
  • È stato assegnato un database predefinito all'account di accesso ma non è stato creato un mapping utente nel database specificato.
  • L'utente mappato per l'account di accesso è stato negato. Ad esempio, questo può verificarsi se l'utente viene aggiunto inavvertitamente a un ruolo predefinito del database db_denydatareader .

Il database predefinito potrebbe non essere disponibile al momento della connessione per i motivi seguenti:

  • Il database predefinito è in modalità sospetta.
  • Il database predefinito non esiste più.
  • Il nome predefinito del database non è corretto.
  • Il database predefinito è in modalità utente singolo e l'unica connessione disponibile è già usata da un utente o da un altro utente.
  • Il database predefinito è stato scollegato.
  • Il database predefinito è impostato su uno stato RESTRICTED_USER.
  • Il database predefinito è offline.
  • Il database predefinito è impostato su uno stato EMERGENCY.
  • Il database predefinito fa parte di un database mirror.

Inoltre, l'account di accesso può essere membro di più gruppi e il database predefinito per uno di questi gruppi non è disponibile al momento della connessione.

Per altre informazioni sugli utenti del database in SQL Server, vedere Creare un utente del database.

Azione utente

È possibile eseguire una delle azioni seguenti:

Risolvere il problema

Se non è necessario accedere al database predefinito attualmente configurato ed è sufficiente connettersi all'istanza di SQL Server per altre operazioni usando SQL Server Management Studio (SSMS), seguire questa procedura:

  1. Apri SQL Server Management Studio (SSMS).

  2. In Esplora oggetti selezionare Connetti> motore di database.

  3. Compilare la finestra di dialogo Connetti al server .

  4. Selezionare Opzioni.

  5. In Proprietà connessione modificare il valore Connetti al database usando una delle opzioni seguenti:

    • Se l'account di accesso è membro del ruolo sysadmin, immettere mastere selezionare Connetti per stabilire una connessione a SQL Server. Dopo aver stabilito la connessione a SQL Server, è possibile modificare il database predefinito impostando un database diverso attualmente disponibile nella pagina Generale delle proprietà dell'account di accesso in SSMS. Per altre informazioni, vedere Creazione di un account di accesso.

    • Se l'account di accesso non è membro del ruolo sysadmin, immettere un nome di database nel server a cui si sa di avere accesso. In alternativa, è possibile provare a immettere un nome di database di sistema come master e quindi selezionare Connetti. Questo passaggio potrebbe non funzionare se l'amministratore di sistema ha negato in modo esplicito le autorizzazioni a un utente guest nel master database. In questo scenario è necessario collaborare con l'amministratore di sistema per risolvere il problema.

Correggere il problema

Un amministratore di sistema può controllare qual è il database predefinito corrente dell'utente, usando la query seguente:

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

Usare la tabella seguente per determinare l'azione appropriata per risolvere il problema per le cause associate:

Causa Risoluzione
Non esiste alcun mapping utente nel database predefinito dell'account di accesso o l'accesso all'utente è stato negato. Questi utenti del database sono detti anche utenti orfani. Questo problema si verifica in genere quando i database vengono spostati tra due istanze del server ed è una delle cause comuni dell'errore 4064. Per rilevare gli utenti orfani e risolvere il problema, vedere Risolvere i problemi relativi agli utenti orfani (SQL Server).
Nessun utente del database esistente per l'account di accesso Creare un utente del database e assegnare le autorizzazioni pertinenti per accedere al database.
L'account utente del database ha negato le autorizzazioni per accedere al database Passare alle proprietà utente nel database (Espandere utenti della sicurezza>del nodo >di database) e verificare se l'utente fa parte del ruolo db_denydatareader nella pagina Appartenenza. È anche possibile controllare le autorizzazioni valide di un utente usando sys.fn_my_permissions.
Il database predefinito è in modalità sospetta. Un database può risultare sospetto per svariati motivi. Le possibili cause includono la negazione dell'accesso a una risorsa di database dal sistema operativo e l'indisponibilità o il danneggiamento di uno o più file di database. È possibile controllare lo stato del database usando questa query: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';. In SSMS lo stato dei database sospetti viene visualizzato come (Ripristino in sospeso). Per risolvere questa situazione, potrebbe essere necessario ripristinare il database dal relativo backup.
Nome del database non corretto in stringa di connessione Quando si tenta di connettersi a un database che non esiste, è possibile che venga visualizzato il messaggio di errore seguente:
Cannot open database "AdventureWorks" requested by the login. The login failed.
Il sistema di gestione del database (DBMS) potrebbe anche visualizzare il Login failed for user CONTOSO\user1 messaggio di errore. Per altre informazioni, vedere MSSQLSERVER_18456.
Il log degli errori di SQL Server avrà il messaggio seguente:
"Accesso non riuscito per l'utente 'CONTOSO\User1'. Motivo: impossibile aprire il database specificato in modo esplicito "AdventureWorks".
Per risolvere questo errore, assicurarsi che il nome del database sia uguale sia nel messaggio di errore che nella voce del log degli errori. Modificare il stringa di connessione se non è corretto o concedere all'utente le autorizzazioni necessarie.
Il database predefinito non esiste più. Se il database è stato rimosso intenzionalmente dal server, modificare il database predefinito per l'account di accesso a un altro database esistente nel server usando SSMS o un'istruzione ALTER LOGIN (Transact-SQL). Facoltativamente, è possibile verificare se sono presenti altri account di accesso nel server il cui database predefinito è impostato su questo database non esistente usando questa query: SELECT name AS Login_Name FROM sys.server_principals where default_database_name = '<removed-dbname>';.
Il database predefinito è in modalità utente singolo e l'unica connessione viene usata dall'amministratore o da un altro utente. Se il database è impostato sulla modalità utente singolo a scopo di manutenzione, è consigliabile impostarlo di nuovo sulla modalità multiutente dopo il completamento dell'attività di manutenzione, usando questa query: ALTER DATABASE <dbname> SET MULTI_USER;.
Per ulteriori informazioni, vedere Impostare un database in modalità utente singolo.
Nota: per verificare se un database è in modalità utente singolo, è possibile usare questa query: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.
Se è ancora necessario limitare l'accesso al database, ma si vuole abilitare la connettività per gli account di accesso interessati, modificare il database predefinito in un database diverso nel server.
Il database predefinito è stato scollegato. Il scollegamento di un database lo rimuove dall'istanza di SQL Server e non è più accessibile. Per renderlo disponibile per gli account di accesso, collegare il database usando SSMS o una stored procedure sp_attach_db . Per ulteriori informazioni, vedi Collegamento e scollegamento di un database (SQL Server).
Il database predefinito è stato impostato su uno stato RESTRICTED_USER. Quando un database è impostato su uno stato RESTRICTED_USER, solo i membri del ruolo predefinito del database db_owner e dbcreator e i ruoli predefiniti del server sysadmin possono connettersi al database. Se non è più necessario limitare l'accesso al database corrispondente, impostare il database sulla modalità multiutente usando questa query: ALTER DATABASE <dbname> SET MULTI_USER;.
Nota: per verificare se un database si trova in uno stato utente con restrizioni, è possibile usare questa query: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.
Se è ancora necessario limitare l'accesso al database, ma si vuole abilitare la connettività per gli account di accesso interessati, modificare il database predefinito in un database diverso nel server.
Il database predefinito è offline. Non è possibile modificare un database nello stato offline. È possibile portare online il database usando questa query: ALTER database <dnname> SET ONLINE;.
È possibile verificare se un database è OFFLINE usando SSMS o usando questa query: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.
Per altre informazioni, vedere Stati del database e opzioni ALTER DATABASE SET (Transact-SQL) - SQL Server.
Se è ancora necessario mantenere il database in uno stato offline, ma si vuole abilitare la connettività per gli account di accesso interessati, modificare il database predefinito in un database diverso nel server.
Il database predefinito è impostato su uno stato EMERGENCY. Un database potrebbe essere stato inserito in uno stato EMERGENCY per la risoluzione dei problemi da parte di un amministratore di sistema. Solo gli utenti del ruolo sysadmin possono accedere ai database impostati su uno stato EMERGENCY. È possibile portare online il database usando questa query: ALTER database <dnname> SET ONLINE;.
È possibile verificare se un database si trova in uno stato EMERGENCY usando SSMS o la query seguente: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.
Per altre informazioni, vedere Stati del database e opzioni ALTER DATABASE SET (Transact-SQL).
Se è ancora necessario mantenere il database in uno stato EMERGENCY, ma si vuole abilitare la connettività per gli account di accesso interessati, modificare il database predefinito in un database diverso nel server.
Il database predefinito fa parte del mirror del database. Non è possibile connettersi a un database mirror nel server mirror e questo comportamento è progettato. Per verificare se il database è attualmente nel ruolo mirror, usare questa query SELECT DB_NAME(database_id) as database_name, mirroring_role_desc FROM sys.database_mirroring WHERE DB_NAME(database_id) = '<dbname>';. Per altre informazioni sul mirroring del database, vedere Mirroring del Database (SQL Server).
L'account di accesso può essere membro di più gruppi e il database predefinito per uno dei gruppi non è disponibile al momento della connessione. Per enumerare i gruppi con un utente specificato usando PowerShell, vedere Get-ADPrincipalGroupMembership (ActiveDirectory).

Modificare il database predefinito per un determinato utente

Per apportare modifiche al database predefinito di un utente, è necessario disporre dell'autorizzazione ALTER ANY LOGIN. Se l'account di accesso da modificare è un membro del ruolo predefinito del server sysadmin o di un utente autorizzato dell'autorizzazione CONTROL SERVER, è necessaria anche l'autorizzazione CONTROL SERVER quando si apportano le modifiche seguenti. Per impostazione predefinita, i membri del ruolo sysadmin dispongono di queste autorizzazioni abilitate. Per altre informazioni, vedere ALTER LOGIN (Transact-SQL).

Modificare il database predefinito usando SSMS

  1. Connettersi all'istanza di SQL Server usando SQL Server Management Studio (SSMS).

  2. Selezionare Account di accesso di sicurezza>per individuare l'utente e modificare il database predefinito dell'utente in un database diverso attualmente disponibile nella pagina Generale delle proprietà dell'account di accesso in SSMS. Per altre informazioni, vedere Creazione di un account di accesso.

  3. Dopo la connessione all'istanza di SQL Server, è possibile eseguire un'istruzione ALTER LOGIN , come negli esempi seguenti:

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

    <AvailableDatabaseName> è un segnaposto per il nome del database esistente a cui è possibile accedere dall'account di accesso di SQL Server nell'istanza. <LoginName> è un segnaposto per l'account di accesso di SQL Server con le autorizzazioni necessarie ALTER LOGIN .

    Ad esempio:

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

Viene visualizzato l'errore 18456 insieme all'errore 4064

Quando si usano applicazioni come SSMS che ricevono l'errore 4064 visualizzato all'utente, viene registrato il messaggio seguente nel log degli errori di SQL Server. Questo comportamento è impostato a livello di progettazione. La correzione del database predefinito per l'account di accesso non riuscito, utilizzando le procedure descritte in questo articolo, risolve automaticamente l'errore 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 >]