IF object_id('dbo.sp_fix_user_login_mismatch') IS NOT NULL
  BEGIN
   DROP PROCEDURE dbo.sp_fix_user_login_mismatch
  END
GO
CREATE PROCEDURE dbo.sp_fix_user_login_mismatch
AS

DECLARE @username sysname

-- Map all the database users to the logins that have the same name.
SELECT top 1 @username = su.name
FROM sysusers su
  INNER JOIN master..syslogins sl
  ON su.name = sl.name
WHERE su.issqluser = 1
  and (su.sid is not null and su.sid <> 0x0)
  and suser_sname(su.sid) is null

WHILE @username is not null
  BEGIN
    IF @username='dbo'
      BEGIN
        PRINT N'mapped sa to the dbo user...'
        EXEC sp_changedbowner 'sa'
      END
    ELSE
      BEGIN
        PRINT N'mapped the login "' + @username + '" to the database user "' + @username + '"...'
        EXEC sp_change_users_login 'update_one', @username, @username
      END

    SELECT @username = null

   SELECT top 1 @username = su.name
    FROM sysusers su
      INNER JOIN master..syslogins sl
      ON su.name = sl.name
    WHERE su.issqluser = 1 and (su.sid is not null and su.sid <> 0x0)
      AND suser_sname(su.sid) is null
  END

-- Remove all the database users that do not have a matching login.
SELECT top 1 @username = su.name
FROM sysusers su
  LEFT JOIN master..syslogins sl
  ON su.name = sl.name
WHERE su.issqluser = 1 and (su.sid is not null and su.sid <> 0x0)
  AND suser_sname(su.sid) is null
  AND sl.name is null

WHILE @username is not null
  BEGIN
    print N'Dropping user ' + @username + '...'
    exec sp_dropuser @username

    SELECT @username = null

    SELECT top 1 @username = su.name
    FROM sysusers su
      LEFT JOIN master..syslogins sl
      ON su.name = sl.name
    WHERE su.issqluser = 1 and (su.sid is not null and su.sid <> 0x0)
      AND suser_sname(su.sid) is null
      AND sl.name is null
  END

RETURN(0)
GO
