Права доступа пользователя перепутаны после резервного копирования -> Операция восстановления

11

Мне пришлось перенести несколько баз данных SQL Server 2008 на наш новый сервер баз данных, поэтому я скопировал их все (в файлы .bak), скопировал эти файлы в новый ящик и восстановил их (все сделано с помощью SQL Management Studio).

Все прошло нормально, но теперь я не могу войти ни в одну из баз данных, используя учетную запись SQL Server, которая продолжает работать на старой СУБД. Мой вход с аутентификацией в Windows все еще работает нормально, кстати.

У меня была идея, что пользователи и разрешения будут легко дублироваться на новом сервере базы данных, но, похоже, что-то где-то пошло не так. Буду признателен за комментарии / предложения / предложения помощи ;-)

5arx
источник

Ответы:

7

Я вижу, вы уже нашли решение своей проблемы, но в первоначальном вопросе я заметил, что у вас все еще есть доступ к старому серверу.

Следующий вопрос о SO имел аналогичную проблему и включает ссылки на статью Microsoft со сценарием для создания пользовательских разрешений.

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(Ресурс указан по этому вопросу http://support.microsoft.com/kb/918992 )

Похоже, что изменение настроек сервера с аутентификации Windows на аутентификацию в смешанном режиме решило вашу проблему, но на случай, если это не полностью решит проблему, я подумал, что это может быть полезно.

Джефф
источник
Я уверен, что это будет не первый раз, когда я буду бороться с SQL Server из-за пользователей / разрешений, поэтому я добавлю статью в закладки для потомков. Большое спасибо за публикацию.
5
6

Это известно как «осиротевшие пользователи». Вот 2 способа это исправить

  1. Если вы можете восстановить исходную основную базу данных как «loginsource», а sys.server_principals имеет достаточно информации для генерации всех имен входа SQL Server и Windows. То есть SID и зашифрованный пароль

  2. Если вы используете только учетные записи Windows, вы можете запустить это для каждой базы данных, чтобы сгенерировать скрипт

Автор сценария:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')
ГБН
источник
Спасибо за ваш ответ - мое веб-приложение использует логины SQL, а наши учетные записи Windows используются для администрирования. Я не вижу способа восстановить как «источник входа в систему», как вы предлагаете - не могли бы вы уточнить? Я надеюсь, что все это можно сделать с помощью Managment Studio?
5
PS. Я следовал этому документу: support.microsoft.com/kb/274188 и успешно запустил все сценарии. Но ничего не изменилось.
5
5

В идеале вы должны написать сценарий для пользователей и прав доступа перед выполнением восстановления. Если этого не произошло, то вам нужно исправить положение после свершившегося факта, и, скорее всего, что-то будет упущено, но вы сможете пройти около 90% пути.

Первое, что вам нужно выяснить, это наличие на новом сервере тех же логинов. Если этого не произойдет, вы должны выяснить, все ли в порядке для создания логинов на новом сервере. Никогда не предполагайте, что они должны быть созданы, может быть веская причина, почему они вообще не существуют. Затем вы можете приступить к их созданию, просматривая таблицу sysusers.

Вы можете исправить потерянных пользователей, выполнив что-то похожее на следующее:

DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name 
    FROM sysusers
    WHERE issqluser = 1 
    and (sid is not null and sid <> 0x0)
    and suser_sname(sid) is null
    and name in (select name from master..syslogins)
    ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_change_users_login 'update_one', @username, @username

    FETCH NEXT FROM fixusers
    INTO @username
END CLOSE fixusers
DEALLOCATE fixusers 

Этот код будет работать для SQL2008, но был написан для обратной совместимости с SQL2000.

SQLRockstar
источник
Спасибо за сценарий. Могу ли я предположить, что в Management Studio нет способа сделать это? Кроме того, некоторые люди предлагают мне удалить и воссоздать пользователей уровня БД - это рекомендуется?
5
Это предполагает, что логины уже существуют и только устанавливает SID
gbn
sp_change_users_login не обновляет SID? msdn.microsoft.com/en-us/library/ms174378.aspx
SQLRockstar
5arx - нет способа сделать это в SSMS. Как я уже сказал, в идеальной ситуации вы бы написали свои разрешения перед восстановлением. На этом этапе вам нужно либо воссоздать вручную, либо попытаться собрать вещи вручную. на вашем месте я бы восстановил старую базу данных, прописал разрешения, выполнил восстановление с другого сервера, а затем повторил ваши разрешения.
SQLRockstar
«Update_One: связывает указанного пользователя в текущей базе данных с существующим именем входа SQL Server. Необходимо указать имя пользователя и имя входа. Пароль должен быть НЕДЕЙСТВИТЕЛЕН или не указан». Таким образом, предполагается, что логины уже существуют.
Гбн