Lors d’une migration ou d’une récupération d’urgence sur un nouveau serveur SQL il est possible que des utilisateurs orphelins apparaissent : si un utilisateur existait sur l’ancien serveur mais pas sur le nouveau, le fait de le recréer sur le nouveau serveur lui attribuera un nouvel SPID. Pour SQLServer il s’agit donc d’un utilisateur différent.
Prenons le cas d’un serveur irrémédiablement endommagé qui contenait des bases SQL et en particulier un utilisateur dev. Les sauvegardes des bases utilisateurs sont restaurées sur un autre serveur SQL et l’utilisateur dev apparaît bien dans la liste des droits pour chaque base mais n’existe pas dans la liste des droits d’accès au serveur et il est donc nécessaire de le recréer. Si l’on affiche alors la liste des droits d’accès aux bases de ce nouvel utilisateur, on constate qu’il n’a accès à aucune base. Pire, si l’on essaye de lui donner les droits nécessaires on obtient le message d’erreur suivant :
L’utilisateur, le groupe ou le rôle ‘dev’ existe déjà dans la base de données en cours. (Microsoft SQL Server, Error: 15023)
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.3054&EvtSrc=MSSQLServer&EvtID=15023&LinkId=20476
Pour remédier à cela on peut utiliser la procédure sp_change_users_login pour lier l’ancien utilisateur au nouveau :
EXEC sp_change_users_login 'update_one','ancien_utilisateur','nouvel_utilisateur'
Si l’on veut lier ces utilisateurs sur toutes les bases on peut utiliser :
EXEC master..sp_msforeachdb "EXEC sp_change_users_login 'update_one','ancien_utilisateur','nouvel_utilisateur'"