Pubblico questo post come mio promemoria dato che mi capita spesso questo problema e faccio prima a cercare qui qual è la stored procedure da utilizzare.
Dopo aver fatto il ripristino di un backup di un database SQL Server o dopo aver eseguito un attach di un file mdf accedendo al database si può ricevere il messaggio di errore:
Exception Details: System.Data.SqlClient.SqlException: Cannot open database “[database name]” requested by the login. The login failed.
Login failed for user ‘[user name]’.
Il problema è dovuto al fatto che lo user definito nel database non è più collegato al login definito in SQL Server.
Per ripristinare i collegamenti tra utenti e login si deve utilizzare la stored procedure sp_change_users_login.
Ad esempio se nel database è definito l’utente User1 è necessario verificare se esiste la login User1 (in caso negativo crearla) e poi eseguire la stored procedure in questo modo:
EXEC sp_change_users_login 'Update_One', 'User1', 'User1'
In maniera ancora più rapida si può eseguire la stored procedure con il parametro AutoFix che collega lo user alla voce di login (se esiste) altrimenti la crea:
EXEC sp_change_users_login 'Auto_Fix', 'User1', NULL, 'userpwd'
In questo esempio se la login User1 non esiste viene creata con password “userpwd”.
E’ sempre possibile sapere quali sono gli utenti di un database non collegati eseguendo la stored procedure con il parametro Report:
EXEC sp_change_users_login 'Report'