How Can We Help?
Save the below script into a stored procedure, and you can call this after restoring a database, but you can also just copy this into a query.
Don’t forget that the query should be using the newly restored database.
EXEC sp_change_users_login 'report'--See all orphaned users in the database. DECLARE @OrphanedUsers TABLE ( IndexKey Int IDENTITY(1,1) PRIMARY KEY, UserName SysName,--nVarChar(128) UserSID VarBinary(85) ) INSERT INTO @OrphanedUsers EXEC sp_change_users_login 'report' DECLARE @CRLF as nVarChar SET @CRLF = CHAR(10) + '&' + CHAR(13)--NOTE: Carriage-Return/Line-Feed will only appear in PRINT statements, not SELECT statements. DECLARE @Sql as nVarChar(MAX) SET @Sql = N'' DECLARE @IndexKey as Int SET @IndexKey = 1 DECLARE @MaxIndexKey as Int SET @MaxIndexKey = (SELECT COUNT(*) FROM @OrphanedUsers) DECLARE @Count as Int SET @Count = 0 DECLARE @UsersFixed as nVarChar(MAX) SET @UsersFixed = N'' DECLARE @UserName as SysName--This is an orphaned Database user. WHILE (@IndexKey <= @MaxIndexKey) BEGIN SET @UserName = (SELECT UserName FROM @OrphanedUsers WHERE IndexKey = @IndexKey) IF 1 = (SELECT COUNT(*) FROM sys.server_principals WHERE Name = @UserName)--Look for a match in the Server Logins. BEGIN SET @Sql = @Sql + 'EXEC sp_change_users_login ''update_one'', [' + @UserName + '], [' + @UserName + ']' + @CRLF SET @UsersFixed = @UsersFixed + @UserName + ', ' SET @Count = @Count + 1 END SET @IndexKey = @IndexKey + 1 END PRINT @Sql EXEC sp_executesql @Sql PRINT 'Total fixed: ' + CAST(@Count as VarChar) + '. Users Fixed: ' + @UsersFixed SELECT ('Total fixed: ' + CAST(@Count as VarChar) + '. Users Fixed: ' + @UsersFixed)[Fixed] EXEC sp_change_users_login 'report'--See all orphaned users still in the database.