как справиться с переназначением, можно сделать только для пользователей, которые были сопоставлены с логинами Windows или SQL

Сценарий:

Пытаюсь восстановить из бакпака, взятого из 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

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


person eglasius    schedule 02.01.2012    source источник
comment
Возможный дубликат: stackoverflow.com/questions/6468813/   -  person Henrik Høyer    schedule 19.03.2021


Ответы (3)


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

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

person eglasius    schedule 02.01.2012

В статье о 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.

person Rbjz    schedule 20.07.2018

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

SELECT *
FROM sys.database_principals
WHERE 1=1
    AND [type] = 'S'
    AND [name] NOT IN ('dbo','guest','INFORMATION_SCHEMA','sys')
    AND authentication_type_desc IN ('WINDOWS','INSTANCE')
person nmbell    schedule 13.10.2019