как бороться с «переназначением может быть сделано только для пользователей, которые были сопоставлены с логинами Windows или SQL» - PullRequest
1 голос
/ 03 января 2012

Сценарий:

Попытка восстановления из bacpac, взятого из SQL Azure.

Либо для нового экземпляра базы данных SQL Azure, либо для локального сервера. Для более ранних версий с порталом управления или клиентскими инструментами DAC Framework .

Кажется, что он работает нормально, и, естественно, пользователи SQL не сопоставляются с логинами SQL после восстановления.

Что я пробовал:

Когда я пытаюсь сопоставить это с: alter user MyUser with login = MyLogin, это не с:

Сообщение 33016, уровень 16, состояние 1, строка 6 Пользователь не может быть переназначен для входа в систему. Преобразование может быть выполнено только для пользователей, которые были сопоставлены с именами входа в Windows или SQL.

Запуск select * from sys.database_principals перечисляет пользователей, но с гораздо более длинным SID, чем у пользователя, прошедшего проверку подлинности SQL, для сравнения.

В помещениях, если я запускаю sp_change_users_login 'Report', пользователи не указаны в списке, поэтому не обнаруживаются как осиротевшие .

Локально, если я пытаюсь использовать sp_change_users_login , произойдет сбой с:

Сообщение 15291, уровень 16, состояние 1, процедура sp_change_users_login, строка 114. Завершение этой процедуры. Имя пользователя «MyUser» отсутствует или недействительно.

Локально, если я попробую его через раздел «Сопоставление пользователей» пользовательского интерфейса свойств входа в систему, я получу:

Не удалось создать пользователя «Мой пользователь». ... Пользователь, группа или роль 'MyUser' уже существует в текущей базе данных.

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

Вопрос:

Как я могу переназначить этих пользователей SQL?

Я бы хотел избежать необходимости заново создавать их с нуля, а также связать их с объектами схемы в базе данных?

Дополнительная информация:

Один тип пользователей SQL, который очень похож на то, что я вижу для пользователей SQL Azure, это пользователи, созданные с

create user AnotherUser without login

Они терпят неудачу точно таким же образом во всех 3 подходах картирования, которые я использовал выше. Это не относится ни к одному из подходов для обычных пользователей SQL. Кроме того, sid также длинный и начинается с того же "0x010500000000000903000000"

Ответы [ 2 ]

0 голосов
/ 20 июля 2018

A Статья sqlmatters объясняет, что

Пользователь без логина - это особый тип пользователя, который намеренно был настроен без ассоциированного входа в систему.

можно проверить, так ли это, изучив SID:

 -- SQL to run to identify users without login :
SELECT CASE WHEN DATALENGTH(sid) = 28
             AND type = 'S'       -- only want SQL users
             AND principal_id > 4 -- ignore built in users
     THEN 1 ELSE 0 END AS is_user_without_login,*
FROM sys.database_principals 

, где пользователи без логина имеют более длинный SID, чем обычные (потерянные) пользователи.

Эти специальные пользователи не могут быть сопоставлены с логином, потому что они созданы таким образом. Кто-то должен был умышленно или по ошибке создать пользователя WITHOUT LOGIN.

0 голосов
/ 03 января 2012

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

В моем случае это было то же самое.Прямо перед публикацией вопроса моей последней попыткой было: другая резервная копия базы данных, она работала без проблем .

...