Назначьте логин пользователю, созданному без входа (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).
Неужели я за рулем без весла?
Ответы
Ответ 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 пользователя в соответствии с идентификатором входа.