Błąd SQL Server 2008 R2: 15023, użytkownik, grupa lub rola już istnieje


16

Mam testową bazę danych, z którą mam problemy z uprawnieniami.
Nie mogę uzyskać dostępu do bazy danych raportowania, a dokumentacja pomocy aplikacji mówi:

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.

Gdy to robię, pojawia się następujący błąd:

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

Przejrzałem ten błąd i wypróbowałem następujące polecenie w każdej bazie danych:

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

Komunikat wskazywał, że polecenia zostały wykonane pomyślnie, ale nadal pojawia się powyższy błąd, gdy próbuję zmapować każdą bazę danych zgodnie z instrukcjami powyżej.

czego mi brakuje?

Komentarz Per Kin (dzięki) Próbowałem: - Kliknąłem użytkownika prawym przyciskiem myszy i wybrałem: Skrypt Zaloguj się jako> Upuść i utwórz do> Nowe okno zapytania. - Uruchomiłem wynikowe zapytanie i próbowałem zmapować role użytkowników, wybierając ponownie dwie pozostałe bazy danych i db_owner, ale nadal pojawia się ten sam komunikat o błędzie, jak powyżej.

Myśli??

Odpowiedzi:


12

Istnieje wiele rzeczy, które możesz wypróbować, a powodzenie każdego z nich będzie prawdopodobnie zależeć od roli serwera.

Na początek, jeśli jest to tylko jeden lub dwóch użytkowników, to szczerze mówiąc, najłatwiejszym sposobem jest usunięcie użytkownika bazy danych z przywróconej bazy danych i pod warunkiem, że istnieje już login serwera, należy ponownie przypisać użytkownika bazy danych do loginu serwera za pomocą SSMS. Jeśli login serwera nie istnieje, po prostu go utwórz, zamapuj użytkownika i presto! Wyruszamy.

Następna opcja: jeśli migrujesz dużą liczbę użytkowników, użyj sp_help_revlogin. sp_help_revlogin to procedura składowana dostarczona przez Microsoft, która pomoże migrować dane logowania z jednego serwera na inny, w tym hasła i identyfikatory SID. Oto dobry artykuł na ten temat SP_HELP_REVLOGIN


Zobacz support.microsoft.com/en-us/kb/918992 Jak przenosić loginy i hasła między instancjami SQL Server
James Jenkins

3

Korzystam z Auto_Fix za pomocą sp_change_users_loginw moim środowisku programistycznym, aby naprawić takie problemy (błąd 15023). Unikaj używania Auto_Fix w sytuacjach wrażliwych z punktu widzenia bezpieczeństwa.

Auto_Fix: łączy wpis użytkownika w widoku katalogu systemowego sys.database_principals w bieżącej bazie danych z loginem SQL Server o tej samej nazwie. Jeśli login o tej samej nazwie nie istnieje, zostanie utworzony. Sprawdź wynik instrukcji Auto_Fix, aby potwierdzić, że faktycznie utworzono poprawny link. Unikaj używania Auto_Fix w sytuacjach wrażliwych z punktu widzenia bezpieczeństwa.

sp_change_users_login 'AUTO_FIX', 'myuser'

Należy również pamiętać, że ta funkcja może zostać usunięta w przyszłej wersji Microsoft SQL Server.

Inne referencje:

  1. Użytkownik, grupa lub rola programu SQL Server 2008 już istnieje w bieżącej bazie danych
  2. POPRAWKA: Błąd 15023: Użytkownik już istnieje w bieżącej bazie danych
  3. SQL odwzorowuje login na istniejącego użytkownika

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

To właściwe podejście.

W przeciwnym razie przejdź do:

Bezpieczeństwo> Loginy> (twoja nazwa użytkownika)> Właściwości> Mapowanie użytkowników

wprowadź opis zdjęcia tutaj

i ponownie przypisz tego użytkownika do wybranej bazy danych.

Możesz użyć następującego zapytania w kontekście bazy danych, aby sprawdzić, czy nie ma sierot:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.