Udostępnij za pomocą


Rozwiązywanie problemów z użytkownikami oddzielonym (SQL Server)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Użytkownicy są oddzieloni w programie SQL Server, gdy użytkownik bazy danych jest oparty na logowaniu w master bazie danych, ale nazwa logowania nie istnieje już w masterprogramie . Może się to zdarzyć, gdy identyfikator logowania zostanie usunięty lub gdy baza danych zostanie przeniesiona na inny serwer, na którym nie istnieje identyfikator logowania. W tym artykule opisano sposób znajdowania oddzielonych użytkowników i ponownego mapowania ich na identyfikatory logowania.

Uwaga / Notatka

Zmniejsz możliwość oddzielonych użytkowników przy użyciu użytkowników zawartej bazy danych dla baz danych, które mogą zostać przeniesione. Aby uzyskać więcej informacji, zobacz Uczyń swoją bazę danych przenośną, korzystając z baz danych z zawartością.

Kontekst

W przypadku połączeń z bazą danych w wystąpieniu programu SQL Server używającym podmiotu zabezpieczeń (tożsamości użytkownika bazy danych) na podstawie nazwy logowania podmiot zabezpieczeń musi mieć prawidłowe dane logowania w master bazie danych. To logowanie jest używane w procesie uwierzytelniania, który weryfikuje tożsamość podmiotu zabezpieczeń i określa, czy podmiot zabezpieczeń może nawiązać połączenie z wystąpieniem programu SQL Server. Identyfikatory logowania programu SQL Server w wystąpieniu serwera są widoczne w widoku katalogu sys.server_principals i widoku zgodności sys.sql_logins .

Identyfikatory logowania programu SQL Server uzyskują dostęp do poszczególnych baz danych jako "użytkownik bazy danych", który jest mapowany na dane logowania programu SQL Server. Istnieją trzy wyjątki od tej reguły:

  • Użytkownicy zawartej bazy danych

    Użytkownicy zawartej bazy danych uwierzytelniają się na poziomie bazy danych użytkownika i nie są powiązani z identyfikatorami logowania. Ten model jest zalecany, ponieważ bazy danych są bardziej przenośne, a użytkownicy zawartej bazy danych nie mogą zostać oddzielone. Należy jednak utworzyć je ponownie dla każdej bazy danych. Ten model może być niepraktyczny w środowisku z wieloma bazami danych.

  • Konto gościa

    Po włączeniu w bazie danych to konto zezwala na logowania programu SQL Server, które nie są mapowane na użytkownika bazy danych w celu uzyskania dostępu do bazy danych jako użytkownika-gościa . Konto gościa jest domyślnie wyłączone.

  • Członkostwa w grupach systemu Microsoft Windows

    Identyfikator logowania programu SQL Server utworzony na podstawie użytkownika systemu Windows może uzyskać dostęp do bazy danych, jeśli użytkownik systemu Windows jest członkiem grupy systemu Windows, która jest również użytkownikiem w bazie danych.

Informacje o mapowaniu identyfikatora logowania programu SQL Server do użytkownika bazy danych są przechowywane w bazie danych. Zawiera ona nazwę użytkownika bazy danych i identyfikator zabezpieczeń (SID) odpowiedniego identyfikatora logowania programu SQL Server. Uprawnienia tego użytkownika bazy danych są stosowane do autoryzacji w bazie danych.

Użytkownik bazy danych (na podstawie identyfikatora logowania), dla którego odpowiednie dane logowania programu SQL Server jest niezdefiniowany lub jest niepoprawnie zdefiniowany w wystąpieniu serwera, nie może zalogować się do wystąpienia. Taki użytkownik jest podobno oddzielonym użytkownikiem bazy danych w tym wystąpieniu serwera. Oddzielone może się zdarzyć, jeśli użytkownik bazy danych jest mapowany na identyfikator logowania SID , który nie znajduje się w master bazie danych. Użytkownik bazy danych może zostać oddzielony po przywróceniu lub dołączeniu bazy danych do innego wystąpienia programu SQL Server, w którym logowanie nigdy nie zostało utworzone. Użytkownik bazy danych może również zostać oddzielony, jeśli odpowiedni identyfikator logowania programu SQL Server zostanie porzucony. Nawet jeśli identyfikator logowania zostanie ponownie utworzony, będzie miał inny SIDelement , więc użytkownik bazy danych będzie nadal oddzielony.

Wykrywanie oddzielonych użytkowników

W przypadku programu SQL Server i pdW

Aby wykryć oddzielonych użytkowników w programie SQL Server na podstawie brakujących identyfikatorów logowania uwierzytelniania programu SQL Server, uruchom następującą instrukcję w bazie danych użytkownika:

SELECT dp.type_desc, dp.sid, dp.name AS user_name
FROM sys.database_principals AS dp
LEFT JOIN sys.server_principals AS sp
    ON dp.sid = sp.sid
WHERE sp.sid IS NULL
    AND dp.authentication_type_desc = 'INSTANCE';

Dane wyjściowe zawierają listę użytkowników uwierzytelniania programu SQL Server i odpowiednich identyfikatorów SID w bieżącej bazie danych, które nie są połączone z żadnym logowaniem do programu SQL Server.

W przypadku usług Azure SQL Database i Azure Synapse Analytics

Tabela sys.server_principals nie jest dostępna w usłudze SQL Database ani w usłudze Azure Synapse Analytics. Zidentyfikuj oddzielonych użytkowników w tych środowiskach, wykonując następujące kroki:

  1. Połącz się z bazą master danych i wybierz identyfikatory SID dla identyfikatorów logowania przy użyciu następującego zapytania:

    SELECT sid
    FROM sys.sql_logins
    WHERE type = 'S';
    
  2. Połącz się z bazą danych użytkowników i przejrzyj identyfikatory SID użytkowników w sys.database_principals tabeli przy użyciu następującego zapytania:

    SELECT name, sid, principal_id
    FROM sys.database_principals
    WHERE type = 'S'
      AND name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys')
      AND authentication_type_desc = 'INSTANCE';
    
  3. Porównaj te dwie listy, aby określić, czy w tabeli bazy danych sys.database_principals użytkowników istnieją identyfikatory SID użytkownika, które nie są zgodne z identyfikatorami SID logowania w master tabeli bazy danych sql_logins .

Rozwiązywanie problemu z oddzielonym użytkownikiem

W bazie danych użyj instrukcji masterCREATE LOGIN z SID opcją ponownego utworzenia brakującego identyfikatora logowania. SID Podaj użytkownika bazy danych uzyskanego w poprzedniej sekcji.

CREATE LOGIN <login_name>
WITH PASSWORD = '<use_a_strong_password_here>',
SID = <SID>;

Aby zamapować oddzielonego użytkownika na identyfikator logowania, który już istnieje w masterprogramie , uruchom instrukcję ALTER USER w bazie danych użytkownika, określając nazwę logowania:

ALTER USER <user_name> WITH Login = <login_name>;

Po ponownym utworzeniu brakującego identyfikatora logowania użytkownik może uzyskać dostęp do bazy danych przy użyciu podanego hasła. Użytkownik może następnie zmienić hasło konta logowania przy użyciu instrukcji ALTER LOGIN :

ALTER LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>';

Ważne

Każde logowanie może zmienić własne hasło. Tylko identyfikatory logowania z ALTER ANY LOGIN uprawnieniami mogą zmienić hasło logowania innego użytkownika. Jednak tylko członkowie roli sysadmin mogą modyfikować hasła członków roli administratora systemu .