A quick check to see if there's a role mismatch between the local/server roles:
==================
select u.name as local_rolename, role_name(r.id) as server_rolename
from sysusers u,
sysroles r
where u.uid = r.lrid
and role_name(r.id) != u.name
order by 1
==================
As for fixing any role mismatch issues ... *shrug* ... depends on your preferences ... drop/recreate roles (plus permissions) vs patch system tables. I usually opt for the latter as it allows me to keep the current set of permissions, eg, a) can't always depend on having a master list of permissions in version control and b) can't always reverse engineer sysprotects into grant/revoke commands with 100% certainty.
==================
begin tran
go
declare @rowcount int, @error int
-- update sysroles.id when local/server roles match (by name)
-- but local role id does not match the server role id
update sysroles
set id = role_id(u.name)
from sysusers u,
sysroles r
where u.uid = r.lrid
and role_id(u.name) != r.id
and role_id(u.name) is not NULL
select @rowcount = @@rowcount, @error = @@error
-- test @rowcount/@error; if issues then 'rollback tran' else 'commit tran'
... >>error_handling<<..
-- delete local role when no matching server role
-- delete sysusers entry while we still have sysusers.uid<-->sysroles.lrid relationship
delete sysusers
from sysusers u,
sysroles r
where u.uid = r.lrid
and u.uid != 1
and role_name(r.id) is NULL
select @rowcount = @@rowcount, @error = @@error
-- test @rowcount/@error; if issues then 'rollback tran' else 'commit tran'
... >>error_handling<<..
-- now delete orphan sysroles entries
delete sysroles
where role_name(id) is NULL
select @rowcount = @@rowcount, @error = @@error
-- test @rowcount/@error; if issues then 'rollback tran' else 'commit tran'
... >>error_handling<<..
go
==================