Возможно, вы столкнулись с проблемой, известной как «Сиротские пользователи», , которая обсуждается в этой статье Mircosoft .
По сути, пользователь существует в базе данных, и имя входа существует на сервере, но идентификаторы SPID не совпадают, поэтому пользователь не связан с именем входа, когда база данных восстановлена или подключена к серверу.
Как обсуждалось в статье, хранимая процедура sp_change_users_login
может использоваться для разрешения отдельных имен входа, а следующий сценарий попытается автоматически исправить всех пользователей в базе данных:
IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb..#t_users'))
drop table #t_users
CREATE TABLE #t_users ( [name] SYSNAME)
INSERT #t_users ( [name] )
SELECT [name]
FROM sysusers
WHERE
islogin = 1
AND name NOT IN ('dbo', 'public', 'guest', 'sys', 'INFORMATION_SCHEMA')
order by name
DECLARE @lc_name SYSNAME
SET @lc_name = (SELECT MIN([name]) FROM #t_users)
WHILE @lc_name IS NOT NULL
BEGIN
IF EXISTS(SELECT * FROM master..syslogins WHERE [name] = @lc_name)
BEGIN
EXEC sp_change_users_login 'AUTO_FIX', @lc_name
PRINT 'fixing ' + @lc_name
END
ELSE
PRINT '*** not fixing ' + @lc_name
SET @lc_name = (SELECT MIN([name]) FROM #t_users WHERE [name] > @lc_name )
END