Řešení potíží se osamocenými uživateli (SQL Server)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instanceazure Synapse Analytics

Uživatelé jsou v SQL Serveru osamocení, když je uživatel databáze založen na přihlášení v databázi master, ale přihlášení již v master neexistuje. K tomu může dojít, když se přihlašovací jméno odstraní nebo když se databáze přesune na jiný server, na kterém přihlášení neexistuje. Tento článek popisuje, jak vyhledat osamocené uživatele a znovu je namapovat na přihlášení.

Poznámka:

Snižte možnost vzniku osamocených uživatelů použitím integrovaných uživatelů databáze pro databáze vhodné k přesunu. Další informace naleznete v tématu Nastavení přenositelnosti databáze pomocí obsažené databáze.

Důležité

Uložená sp_change_users_login procedura byla dříve použita k opravě osamocených uživatelů, ale nyní je zastaralá. Místo toho použijte ALTER USER ... WITH LOGIN , jak je popsáno v části Řešení osamocených uživatelů . Další informace najdete v tématu sp_change_users_login (Transact-SQL).

Pozadí

Pro připojení k databázi na instanci SQL Serveru, která používá principál zabezpečení (identitu uživatele databáze) podle přihlášení, musí mít principál v master databázi platné přihlášení. Toto přihlášení se používá v procesu ověřování, který ověřuje identitu objektu zabezpečení a určuje, jestli se objekt zabezpečení může připojit k instanci SQL Serveru. Přihlášení SQL Serveru v instanci serveru jsou viditelná v zobrazení katalogu sys.server_principals a ve zobrazení kompatibility sys.sql_logins.

Uživatelská přihlášení k SQL Serveru přistupují k jednotlivým databázím jako "databázový uživatel", který je mapován na přihlášení k SQL Serveru. Toto pravidlo má tři výjimky:

  • Uživatelé databáze s omezením

    Uživatelé vlastní databáze se ověřují na úrovni databáze uživatele a nejsou spojeni s přihlašovacími údaji. Tento model se doporučuje, protože databáze jsou přenosnější a uživatelé databáze s omezením se nemůžou stát osamocenými. Je však nutné je znovu vytvořit pro každou databázi. Tento model může být v prostředí, které má mnoho databází, nepraktické.

  • Účet hosta

    Pokud je tato možnost v databázi povolená, povolí tento účet přihlášení SQL Serveru, která nejsou namapovaná na uživatele databáze, aby k databázi přistupovala jako uživatel typu host . Účet hosta je ve výchozím nastavení zakázaný.

  • Členství ve skupinách Microsoft Windows

    Přihlášení k SQL Serveru vytvořenému uživatelem Systému Windows má přístup k databázi, pokud je uživatel Systému Windows členem skupiny Systému Windows, která je také uživatelem v databázi.

Informace o mapování přihlášení SQL Serveru k uživateli databáze jsou uloženy v databázi. Obsahuje název uživatele databáze a identifikátor zabezpečení (SID) odpovídajícího přihlášení k SQL Serveru. Oprávnění tohoto uživatele databáze se použijí pro autorizaci v databázi.

Uživatel databáze (na základě přihlášení), pro který není definováno odpovídající přihlášení k SQL Serveru nebo je nesprávně definován v instanci serveru, se nemůže přihlásit k instanci. Takový uživatel je osamocený uživatel databáze v této instanci serveru. K osamocení může dojít v případě, že je uživatel databáze namapovaný na přihlášeníSID, které v databázi není.master Uživatel databáze se může stát osamoceným po obnovení databáze nebo připojení k jiné instanci SQL Serveru, kde se přihlášení nikdy nevytvořilo. Uživatel databáze se může také stát osamoceným, pokud se zahodí odpovídající přihlášení k SQL Serveru. I když se přihlašovací jméno znovu vytvoří, má jiné SID, takže uživatel databáze je stále osiřelý.

Detekce osamocených uživatelů

For SQL Server

Pokud chcete zjistit osamocené uživatele na SQL Serveru na základě chybějících přihlášení k ověřování SQL Serveru, spusťte v uživatelské databázi následující příkaz:

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';

Výstup uvádí uživatele ověřování SQL Serveru a odpovídající identifikátory SID v aktuální databázi, které nejsou propojené s žádným přihlášením k SQL Serveru.

Pro všechny Azure SQL Database a Azure Synapse Analytics

Tabulka sys.server_principals není dostupná ve službě SQL Database ani Azure Synapse Analytics. Pokud chcete v těchto prostředích identifikovat osamocené uživatele, proveďte následující kroky:

  1. Připojte se k master databázi a pomocí následujícího dotazu vyberte identifikátory SID pro přihlášení:

    SELECT sid
    FROM sys.sql_logins
    WHERE type = 'S';
    
  2. Připojte se k uživatelské databázi a pomocí následujícího dotazu zkontrolujte identifikátory SID uživatelů v sys.database_principals tabulce:

    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. Porovnejte dva seznamy a určete, jestli jsou v tabulce databáze sys.database_principals uživatele identifikátory SID, které nejsou v tabulce databáze master spárované přihlašovacími identifikátory SIDsql_logins.

Řešení osamocených uživatelů

master V databázi použijte příkaz CREATE LOGIN s SID možností znovu vytvořit chybějící přihlášení. SID Zadejte uživatele databáze, kterého jste získali v předchozí části.

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

Pokud chcete namapovat osiřelého uživatele na přihlášení, které již existuje v master, spusťte v uživatelské databázi příkaz ALTER USER se zadáním názvu přihlášení:

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

Při opětovném vytvoření chybějícího přihlášení může uživatel získat přístup k databázi pomocí zadaného hesla. Uživatel pak může změnit heslo přihlašovacího účtu pomocí příkazu ALTER LOGIN :

ALTER LOGIN <login_name> WITH PASSWORD = '<new-password>';

Důležité

Jakékoli přihlášení může změnit své vlastní heslo. Pouze přihlášení s ALTER ANY LOGIN oprávněním můžou změnit heslo pro přihlášení jiného uživatele. Hesla členů role sysadmin ale můžou upravovat jenom členové role sysadmin .

Zastaralé metody

V dřívějších verzích SQL Serveru se uložená sp_change_users_login procedura použila k vyřešení osiřelých uživatelů. Tento postup je zastaralý a může být odebrán v budoucí verzi. Místo toho použijte ALTER USER.

Následující tabulka uvádí ekvivalentní moderní syntaxi pro běžné sp_change_users_login operace:

Zastaralá syntaxe Doporučená náhrada
EXEC sp_change_users_login 'Report' SELECT dp.name FROM sys.database_principals dp LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid WHERE sp.sid IS NULL AND dp.authentication_type_desc = 'INSTANCE'
EXEC sp_change_users_login 'Auto_Fix', '<user>' ALTER USER <user> WITH LOGIN = <user>
EXEC sp_change_users_login 'Update_One', '<user>', '<login>' ALTER USER <user> WITH LOGIN = <login>

Další informace najdete v tématu sp_change_users_login (Transact-SQL).