Impossibile aprire il database "test" richiesto dal login. Il login non è riuscito. Accesso non riuscito per l'utente "xyz \ ASPNET"


97

Ho creato un servizio web che salva alcuni dati in db. Ma ricevo questo errore:

Impossibile aprire il database "test" richiesto dal login. Il login non è riuscito. Accesso non riuscito per l'utente "xyz \ ASPNET".

La mia stringa di connessione è

Data Source=.\SQLExpress;Initial Catalog=IFItest;Integrated Security=True

Abbiamo bisogno di molte più informazioni prima di poter aiutare a diagnosticare questo.
sblom

Risposte:


47

Ebbene, l'errore è abbastanza chiaro, no? Stai tentando di connetterti al tuo SQL Server con l'utente "xyz / ASPNET", che è l'account con cui viene eseguita l'app ASP.NET.

Questo account non è autorizzato a connettersi a SQL Server: creare un account di accesso su SQL Server per tale account oppure specificare un altro account SQL Server valido nella stringa di connessione.

Puoi mostrarci la tua stringa di connessione (aggiornando la tua domanda originale)?

AGGIORNAMENTO: Ok, stai utilizzando l'autenticazione Windows integrata -> devi creare un account di accesso SQL Server per "xyz \ ASPNET" sul tuo SQL Server - o modificare la stringa di connessione in qualcosa di simile:

connectionString="Server=.\SQLExpress;Database=IFItest;User ID=xyz;pwd=top$secret"

Se hai un utente "xyz" con una password di "top $ secret" nel tuo database.


11
Non "non è consentito connettersi a SQL Server", ma "non è consentito utilizzare il database" test "".
wRAR

@wRAR: true - ma immagino che la possibilità che l'accesso dell'utente esista sul server, ma non è abilitato in questo particolare database, è probabilmente scarsa (almeno penserei)
marc_s

Vedi anche "Database = IFItest" vs "test", anche se potrebbe essere un errore di stampa.
wRAR

2
Un punto che non hai mai toccato è che anche il nome DB potrebbe essere sbagliato. Ho ricevuto un messaggio di eccezione dall'aspetto idem dal mio Azure SQL Server e ho scoperto di aver dato un nome sbagliato per il mio DB in una delle stringhe di connessione nel codice C # nel mio progetto ASP.NET.
Ron16

Ron, quello era il mio problema. Avevo anche ricontrollato l'ortografia, ma anche allora non l'ho capito.
Darrell Lloyd Harvey

32
  • O: "xyz \ ASPNET" non è un login (in sys.server_principals)
  • Oppure: "xyz \ ASPNET" è impostato ma non mappato a un utente nel test del database (sys.database_principals)

Preferisco la seconda opzione: il messaggio di errore implica che il database predefinito non è presente o non dispone dei diritti, piuttosto che non configurato come accesso.

Per verificare se è impostato come accesso

SELECT SUSER_ID('xyz\ASPNET') -- (**not** SUSER_SID)

Se NULL

CREATE LOGIN [xyz\ASPNET] FROM WINDOWS

Se non è NULL

USE test
GO
SELECT USER_ID('xyz\ASPNET')

Se NULL

USE test
GO
CREATE USER [xyz\ASPNET] FROM LOGIN [xyz\ASPNET]

1
Questo è semplicemente fantastico !, un semplice flusso di lavoro per rilevare e risolvere il problema.
Mazen el Senih

12

Ho avuto questo problema e ciò che mi ha risolto è stato:

  • Vai ai pool di applicazioni in IIS
  • Fare clic con il tasto destro sul pool di applicazioni del progetto
  • Nella sezione Modello di processo apri Identità
  • Scegli l'opzione Account personalizzato
  • Immettere il nome utente e la password del PC.

Ha funzionato anche per me!
Mazen el Senih

8

La migliore soluzione per il problema di accesso è creare un utente di accesso in sqlServer. Di seguito sono riportati i passaggi per creare un account di accesso di SQL Server che utilizza l'autenticazione di Windows (SQL Server Management Studio):

  1. In SQL Server Management Studio, aprire Esplora oggetti ed espandere la cartella dell'istanza del server in cui creare il nuovo account di accesso.
  2. Fare clic con il pulsante destro del mouse sulla cartella Protezione, scegliere Nuovo e quindi fare clic su Accesso.
  3. Nella pagina Generale, inserisci il nome di un utente Windows nella casella Nome di accesso.
  4. Seleziona Autenticazione di Windows.
  5. Fare clic su OK.

Ad esempio, se il nome utente è xyz\ASPNET, immettere questo nome nella casella Nome di accesso.

Inoltre è necessario modificare la mappatura dell'utente per consentire l'accesso al database a cui si desidera accedere.


8

La maggior parte delle volte, non è un problema di accesso, ma un problema con la creazione del database stesso. Quindi, se si verifica un errore durante la creazione del database, non verrà creato in primo luogo. In tal caso, se si tentasse di accedere, indipendentemente dall'utente, l'accesso non riuscirà. Questo di solito accade a causa di un'errata interpretazione logica del contesto del database.

Visita il sito in un browser e leggi VERAMENTE quei log degli errori, questo può aiutarti a individuare il problema con il tuo codice (di solito problemi logici in conflitto con il modello).

Nel mio caso, il codice è stato compilato correttamente, lo stesso problema di accesso, mentre stavo ancora scaricando Management Studio, ho esaminato il registro degli errori, risolto i vincoli del contesto del database e il sito ha iniziato a funzionare bene .... nel frattempo Management Studio sta ancora scaricando


6

Per me il database non è stato creato e il codice EF prima avrebbe dovuto crearlo, ma restituire sempre questo errore. La stessa stringa di connessione funzionava nel progetto Web predefinito di aspnet core. La soluzione era aggiungere

_dbContext.Database.EnsureCreated()

prima del primo contatto con il database (prima del seeding del database).


4

Il problema

L'errore si presenta come un messaggio simile a questo:

Impossibile aprire il database "DATABASE NAME" richiesto dal login. Il login non è riuscito. Accesso non riuscito per l'utente XYZ.

  • L'errore in genere non può essere corretto con un semplice Visual Studio o il riavvio completo del computer.
  • L'errore può anche essere trovato come un file di database apparentemente bloccato.

La correzione

La soluzione viene posta nei seguenti passaggi. Non perderai alcun dato nel tuo database e non dovresti cancellare il tuo file di database!

Prerequisito: è necessario aver installato SQL Server Management Studio (Full o Express)

  1. Apri SQL Server Management Studio
  2. Nella finestra "Connect to Server" (File-> Connect object explorer) inserisci quanto segue:
    • Tipo di server: motore di database
    • Nome server: (localdb) \ v11.0
    • Autenticazione: [Qualunque cosa tu abbia usato quando hai creato il tuo database locale. Probabilmente l'autenticazione di Windows).
  3. Fai clic su "Connetti"
  4. Espandi la cartella "Database" in Esplora oggetti (Visualizza-> Esplora oggetti, F8)
  5. Trova il tuo database. Dovrebbe essere denominato come il percorso completo del file del database (.mdf)
    • Dovresti vedere che dice "(Pending Recovery)" alla fine del nome del database o quando provi ad espandere il database non sarà in grado di farlo e potrebbe o meno darti un messaggio di errore.
    • Questo è il problema! Il tuo database è sostanzialmente andato in crash ..
  6. Fare clic con il tasto destro sul database, quindi selezionare "Attività -> Scollega ...".
  7. Nella finestra di scollegamento, seleziona il tuo database nell'elenco e controlla la colonna che dice "Drop Connections"
  8. Fare clic su OK.
  9. Dovresti vedere il database scomparire dall'elenco dei database. Il tuo problema dovrebbe ora essere risolto. Vai ed esegui la tua applicazione che usa il tuo localdb.
  10. Dopo aver eseguito l'applicazione, il database verrà nuovamente visualizzato nell'elenco dei database: è corretto. Non dovrebbe più dire "In attesa di ripristino" poiché dovrebbe funzionare correttamente.

La fonte della soluzione: https://www.codeproject.com/Tips/775607/How-to-fix-LocalDB-Requested-Login-failed


Il problema è che non riesco nemmeno a trovare quel DB.
Shimmy Weitzhandler

3

Succede anche quando si digita un nome errato del DB

ex : xxx-db-dev to xxx-dev-db

A volte, è solo uno stupido errore. Mi ci vuole circa 1 ora per scoprirlo :( perché prima provo solo molte cose difficili


2

Ho provato ad aggiornare l'utente e ha funzionato. Vedi il comando sotto.

USE ComparisonData// databaseName
EXEC  sp_change_users_login @Action='update_one', @UserNamePattern='ftool',@LoginName='ftool';

Basta sostituire di user('ftool')conseguenza.


2

Questo funziona per me.

  1. Vai a SQL Server >> Sicurezza >> Login e fai clic con il tasto destro su NT AUTHORITY \ NETWORK SERVICE e seleziona Proprietà
  2. Nella schermata appena aperta delle proprietà di accesso, vai alla scheda "Mappatura utente".
  3. Quindi, nella scheda "Mappatura utente", selezionare il database desiderato, in particolare il database per il quale viene visualizzato questo messaggio di errore.
  4. Fare clic su OK.

Leggi questo blog.

http://blog.sqlauthority.com/2009/08/20/sql-server-fix-error-cannot-open-database-requested-by-the-login-the-login-failed-login-failed-for- user-nt-authoritynetwork-service /


grazie, l'utilizzo di "NT AUTHORITY \ SYSTEM" ha risolto il mio problema.
Farzad Karimi

2

Ho utilizzato l'autenticazione di Windows per connettermi al file .mdf del database locale e il mio server locale era sql server 2014. Il mio problema è stato risolto utilizzando questa stringa di connessione:

string sqlString = " Data Source = (LocalDB)\\MSSQLLocalDB;" + "AttachDbFilename = F:\\.........\\myDatabase.mdf; Integrated Security = True; Connect Timeout = 30";

Ho dovuto rimuovere questa parte "User Instance = True" per far funzionare il mio DB locale
Anonimo

2

Nel mio caso è un problema diverso. Il database si è trasformato in modalità utente singolo e una seconda connessione al database mostrava questa eccezione. Per risolvere questo problema, segui i passaggi seguenti.

  1. Assicurati che l'esploratore oggetti sia puntato a un database di sistema come master.
  2. Esegui a exec sp_who2e trova tutte le connessioni al database "my_db". Termina tutte le connessioni eseguendo KILL { session id }dove l'ID di sessione è lo SPID elencato da sp_who2.
USE MASTER;
EXEC sp_who2
  1. Modifica il database
USE MASTER;
ALTER DATABASE [my_db] SET MULTI_USER
GO

1

Non l'ho visto menzionato nei numeri precedenti, quindi lasciatemi buttare fuori un'altra possibilità. Potrebbe essere che IFItestnon è raggiungibile o semplicemente non esiste. Ad esempio, se si dispone di un numero di configurazioni, ciascuna con il proprio database, è possibile che il nome del database non sia stato modificato in quello corretto per la configurazione corrente.


1

NB: se si utilizza un servizio Windows per ospitare il servizio web.

È necessario assicurarsi che il servizio Web utilizzi l'account di accesso corretto per connettersi a SQL Server.

  • Servizi aperti (presumo che il servizio Windows sia stato installato)
  • Fare clic con il tasto destro sul servizio e andare alle proprietà.
  • Fare clic sulla scheda "Accedi"
  • Fare clic sul pulsante di opzione "Questo account"
  • Fare clic su "Sfoglia"
  • Immettere il nome utente del PC nel campo di testo e fare clic sul pulsante "Controlla nome" a destra.
  • Fare clic sul testo nel campo di testo, premere il pulsante "OK"
  • inserisci la password di accesso e applica

1

Ispirato dalla risposta di cyptus che ho usato

_dbContext.Database.CreateIfNotExists();

su EF6 prima del primo contatto con il database (prima del seeding del database).


1

Se non hai creato il database nel tuo server, otterrai lo stesso errore di accesso. Assicurati che il database esista prima di accedere.


1

Ho riscontrato questo problema durante il tentativo di scrivere nel database predefinito fornito nel modello mvc asp.net. Ciò era dovuto al fatto che il database non era stato ancora creato.

Per creare il database e assicurarti che sia accessibile segui questi passaggi:

  1. Apri la console di Gestione pacchetti in Visual Studio
  2. Esegui il comando "update-database"

Questo creerà il database ed eseguirà tutte le migrazioni necessarie su di esso.


0

L'opzione migliore sarebbe utilizzare l'autenticazione integrata di Windows poiché è più sicura dell'autenticazione sql. Crea un nuovo utente Windows in SQL Server con le autorizzazioni necessarie e modifica l'utente IIS nelle impostazioni di sicurezza del pool di applicazioni.


0

Ho scoperto che dovevo anche impostare l'opzione UserMapping durante la creazione di un nuovo accesso e questo ha risolto il problema per me. Spero che questo aiuti chiunque si sia ritrovato bloccato qui!

Modifica: l'impostazione dell'accesso come proprietario del database ha risolto anche il problema successivo


0

Alcune volte questo problema può verificarsi se apri questo db in un altro server sql (ad esempio, avvii sql managment studio (SMS) e aggiungi questo db) e dimentichi di arrestare questo server. Di conseguenza, la tua app tenta di connettersi con l'utente già connesso a questo db sotto un altro server. Per risolvere il problema, prova ad arrestare questo server tramite Config. server sql dispatcher.

Le mie scuse per il cattivo inglese. Cordiali saluti, Ignat.


0

Nel mio caso l'applicazione asp.net di solito può connettersi al database senza problemi. Ho notato questo messaggio nei log. Mi accendo i log del server SQL e scopro questo messaggio:

2016-10-28 10:27:10.86 Logon       Login failed for user '****'. Reason: Failed to open the explicitly specified database '****'. [CLIENT: <local machine>]
2016-10-28 10:27:13.22 Server      SQL Server is terminating because of a system shutdown. This is an informational message only. No user action is required.

Quindi sembra che il server si stesse riavviando e che il server SQL fosse stato arrestato un po 'prima dell'applicazione ASP.NET e il database non fosse disponibile per alcuni secondi prima del riavvio del server.


0

Anche se hai impostato il login come proprietario del DB e hai impostato la mappatura dell'utente per il database che utilizzerà il login, controlla che l'effettivo utente del DB (non solo il login) abbia il ruolo di "proprietario".


0

Nel mio caso, stavo eseguendo un servizio Windows con l'identità "Sistema". L'errore era:

System.Data.SqlClient.SqlException (0x80131904): 
Cannot open database "MyDbName" requested by the login. The login failed.
Login failed for user 'MYDOMAINNAME\HOSTNAME$'.

Il problema è che l'errore è molto fuorviante. Anche dopo aver aggiunto il login 'MYDOMAINNAME \ HOSTNAME $' al database e concesso l'accesso sysadmin a questo login e aggiunto un utente per quel login sul mio database di destinazione e aver creato quell'utente dbowner, stavo ancora ricevendo lo stesso errore. Apparentemente dovevo fare lo stesso per il login "NT AUTHORITY \ SYSTEM". Dopo averlo fatto, sono stato in grado di accedere senza problemi. Non so perché il messaggio di errore si lamenta di "MYDOMAINNAME \ HOSTNAME $". Ho cancellato quel login e l'utente corrispondente e tutto funziona ancora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.