Подтвердить что ты не робот

Назначьте логин пользователю, созданному без входа (SQL Server)

У меня есть пользователь в моей базе данных, у которого нет связанного входа. Кажется, он был создан без входа.

Всякий раз, когда я пытаюсь подключиться к базе данных с этим пользователем, я получаю следующую ошибку:

Msg 916, Level 14, State 1, Line 1
The server principal "UserName" is not able to access the database 
"DatabaseName" under the current security context.

Я бы хотел указать логин для этого пользователя, чтобы я мог использовать его для доступа к базе данных. Я попробовал следующий script, чтобы связать логин с пользователем.

USE [DatabaseName]
ALTER USER [UserName]
WITH LOGIN = [UserName]

Но это дает мне следующую ошибку:

Msg 33016, Level 16, State 1, Line 2
The user cannot be remapped to a login. Remapping can only be done for users 
that were mapped to Windows or SQL logins.

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

Изменить: в ответ на вопрос Филиппа Келли, вот что я получаю, когда я запускаю select * from sys.database_principals where name = 'username'.

SQL User

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

Edit2:

Хорошо, я сбросил существующий логин, как было предложено gbn, и я использую следующий script для создания нового LOGIN с тем же SID, что и пользователь.

CREATE LOGIN [UserName] 
WITH PASSWORD=N'Password1', 
DEFAULT_DATABASE=[DatabaseName], 
CHECK_EXPIRATION=OFF, 
CHECK_POLICY=OFF, 
SID=0x0105000000000009030000001139F53436663A4CA5B9D5D067A02390

Теперь, давая мне следующее сообщение об ошибке, похоже, что SID слишком длинный для поля LOGIN SID.

Msg 15419, Level 16, State 1, Line 1
Supplied parameter sid should be binary(16).

Неужели я за рулем без весла?

4b9b3361

Ответ 1

У вас есть осиротевший пользователь, и это не может быть переназначено с помощью ALTER USER (пока), потому что нет логина для сопоставления. Итак, сначала нужно запустить CREATE LOGIN.

Если пользователь уровня базы данных

  • Windows Login, сопоставление будет автоматически фиксировано через AD SID
  • SQL Login, используйте "sid" из sys.database_principals для параметра SID для входа

Затем запустите ALTER USER

Изменить, после комментариев и обновлений

Сид из sys.database_principals предназначен для входа в систему Windows.

Таким образом, попытка создания и повторной привязки к SQL Login завершится неудачно

Запустите это, чтобы получить вход в Windows

SELECT SUSER_SNAME(0x0105000000000009030000001139F53436663A4CA5B9D5D067A02390)

Ответ 2

sp_change_users_login устарел.

Намного проще:

ALTER USER usr1 WITH LOGIN = login1;

Ответ 3

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

С помощью SQL Server 2012 с сиротским SQL_USER это было исправление;

USE databasename                      -- The database I had recently attached
EXEC sp_change_users_login 'Report'   -- Display orphaned users
EXEC sp_change_users_login 'Auto_Fix', 'UserName', NULL, 'Password'

Ответ 4

Сквозь проб и ошибок, кажется, если пользователь был изначально создан "без входа", то этот запрос

select * from sys.database_principals

покажет authentication_type = 0 (NONE).

По-видимому, эти пользователи не могут быть повторно связаны с каким-либо логином (ранее существовавшим или новым, SQL или Windows) с этой команды:

alter user [TempUser] with login [TempLogin]

отвечает на ошибку Remap "Msg 33016", указанную в вопросе.

Также эти пользователи не отображаются в классическом (устаревшем) отчете SP:

exec sp_change_users_login 'Report'

Если кто-нибудь знает способ об этом или как изменить authentication_type, прокомментируйте.

Ответ 5

Какой пользователь базы данных? Запустите select * from sys.database_principals в базе данных и проверьте столбцы type и type_desc для этого name. Если это пользователь Windows или SQL, перейдите с ответом @gbn, но если это что-то еще (это мое непроверенное предположение на основе вашего сообщения об ошибке), у вас возникнет другая проблема.


Изменить

Таким образом, это логин, прошедший проверку подлинности SQL. Назад, когда мы будем использовать sp_change_users_login для исправления таких логинов. SQL 2008 имеет это как "не использовать, будет устаревшим", а это значит, что команда ALTER USER должна быть достаточной... но в этом случае стоит попробовать. Используется правильно (это было время), я считаю, что это обновляет SID пользователя в соответствии с идентификатором входа.