Das Problem: Man nehme eine Datenbanksicherung und stellt diese auf einen anderen SQL Server wieder her. In der Datenbank sind SQL-User enthalten, die auf dem neuen SQL Server kein Login besitzen. Das Anlegen eines neuen Logins passend zu dem User bringt zunächst nichts, da der SQL Server im Falle eines SQL Users eigene interne IDs vergibt. Somit ist für SQL Server das Login identisch mit DB User, wenn die IDs übereinstimmen.
Bsp: Hans besitzt auf SQL 1 ein Login und ist der Datenbank DB1 zugeordnet. Das Backup der DB1 wird auf SQL 2 wiederhergestellt. Hans kann sich nicht einloggen, obwohl er in der DB1 als DB User vorhanden ist.
Logins sind Bestandteil der master Datenbank und kontrolliert bspw. Anmeldungen und Zugehörigkeiten zu Serverrollen. Die Einträge des Datenbankbenutzers in der Datenbank selbst regeln Zugehörigkeiten zu Datenbankrollen und vor allem auch Ausführungsrechte innerhalb der Datenbank.
Eine Lösung wäre etwa den User aus der DB zu entfernen und über das Login neu zu mappen und die Rechte wieder zuzuweisen… aber ehrlich gesagt…grausam!
Ein andere nette Lösung ist, das Login des Users neu anzulegen (gleicher Name) , aber zunächst nicht der Datenbank zuzuordnen (würde sowie scheitern, da er bereits enthalten ist). Mit Hilfe der Prozedur sp_change_users_login kann der DB User dem Login zugeordnet werden
use DB1
sp_change_users_login ‚Auto_fix‘,’Hans‘,NULL,’passw0rd‘
Die Prozedur legt, falls der Benutzer nicht vorhanden ist, das Login an und ordnet dem Login den genannten DB Benutzer zu. (Auto_fix). Gleichzeitig kann auch das Passwort des Logins mit vergeben werden.
Mit
sp_change_users_login ‚Report‘
kann jeder nicht verknüpfte User der Datenbank und seine SID aufgelistet werden. Sofern ein bestehendes Login (Hans) einfach dem DB Benutzer(Hans) einfach nur zugeordnet werden soll, dann erreicht man das mit:
sp_change_users_login ‚Update_one‘, ‚Hans‘,’Hans‘