Ошибка SQL Server 2008 R2: 15023, пользователь, группа или роль уже существует

16

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

Resolution: 

1. Launch the SQL Server Management Studio and connect to the database server(s) hosting   the Vision and Reporting Server databases. 
2. Expand the security folder. 
3. Select logins and right click on the <username> user and choose properties. 
4. Click the User Mapping tab 
5.Make sure the following databases are selected in the Users mapped to this Login:

    ReportServer
    ReportServerTempDB
    Your Vision databases
    This maps the login/user to the respective databases.
6. As you select each database (including your Vision database), select the db_owner role in the Database role membership for: section. You must select this option for each database.

Когда я делаю это, я получаю следующую ошибку:

"Create failed for user '<servername>\<username>'.  User, group, or role '<servername>\<username>' already exists in the current database. (Microsoft SQL Server, Error: 15023)"

Я погуглил эту ошибку и попробовал следующую команду в каждой базе данных:

 ALTER USER [<username>] WITH LOGIN = [<username>] 

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

Что мне не хватает?

За комментарий Кина (спасибо) я попробовал это: - Я щелкнул правой кнопкой мыши по пользователю и выбрал: Script Login As> Drop and Create To> New query window. - Я выполнил полученный запрос и попытался сопоставить роли пользователей, снова выбрав две другие базы данных и db_owner, но все равно получаю то же сообщение об ошибке, что и выше.

Мысли ??

brl8
источник

Ответы:

12

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

Начнем с того, что если это всего лишь один или два пользователя, то, честно говоря, самый простой способ - удалить пользователя базы данных из восстановленной базы данных, и при условии, что уже существует существующий логин сервера, переназначить пользователя базы данных на логин сервера, используя SSMS. Если логин сервера не существует, просто создайте его, сопоставьте пользователя и presto! Понеслось.

Следующая опция: если вы переносите большое количество пользователей, используйте sp_help_revlogin. sp_help_revlogin - это хранимая процедура, поставляемая Microsoft, которая поможет перенести имена входа с одного сервера на другой, включая пароли и SID. Вот хорошая статья об этом SP_HELP_REVLOGIN

Cougar9000
источник
См. Support.microsoft.com/en-us/kb/918992 Как передавать имена входа и пароли между экземплярами SQL Server
Джеймс Дженкинс
3

Я использую Auto_Fix с sp_change_users_loginв моем Dev среде , чтобы исправить такие проблемы (ошибка 15023). Избегайте использования Auto_Fix в ситуациях, чувствительных к безопасности.

Auto_Fix: связывает запись пользователя в представлении системного каталога sys.database_principals в текущей базе данных с именем входа SQL Server с тем же именем. Если логин с таким именем не существует, он будет создан. Изучите результат из оператора Auto_Fix, чтобы убедиться, что на самом деле создана правильная ссылка. Избегайте использования Auto_Fix в ситуациях, чувствительных к безопасности.

sp_change_users_login 'AUTO_FIX', 'myuser'

Также обратите внимание, что эта функция может быть удалена в будущей версии Microsoft SQL Server.

Другие ссылки:

  1. Пользователь, группа или роль SQL Server 2008 уже существуют в текущей базе данных
  2. ИСПРАВЛЕНИЕ: Ошибка 15023: пользователь уже существует в текущих базах данных
  3. SQL сопоставляет логин существующему пользователю
LCJ
источник
0
ALTER USER [<username>] WITH LOGIN=[<username>]

Это правильный подход.

В противном случае перейдите к:

Безопасность> Логины> (ваше имя пользователя)> Свойства> Отображение пользователей

введите описание изображения здесь

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

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

select
    dp.name [user_name]
    ,dp.type_desc [user_type]
    ,isnull(sp.name,'Orhphaned!') [login_name]
    ,sp.type_desc [login_type]
from   
    sys.database_principals dp
    left join sys.server_principals sp on (dp.sid = sp.sid)
where
    dp.type in ('S','U','G')
    and dp.principal_id >4
order by sp.name
Франческо Мантовани
источник
-4

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

user84866
источник