Tento článek popisuje, jak převést přihlášení a hesla mezi instance Microsoft SQL Server 2005, Microsoft SQL Server 2008 a Microsoft SQL Server 2012 na různých serverech.
Další informace o tom, jak převést přihlášení a hesla mezi instancí jiné verze serveru SQL Server klepněte na následující číslo článku databáze Microsoft Knowledge Base:
V tomto článku jsou různé servery A a server B. Navíc servery A a server B se systémem SQL Server 2005.
Poznámka: Tyto informace platí také pro SQL Server 2008 a SQL Server 2012.
Po přesunutí databáze z instance SQL Server na serveru A instance serveru SQL Server na serveru B, uživatelé nebudou moci přihlásit k databázi na serveru B. dále, uživatelé obdržet následující chybovou zprávu:
Přihlášení se nezdařilo pro uživatele "MyUser'. (Microsoft SQL Server, chyba: 18456)
K tomuto problému dochází, protože jste nepřevedly přihlášení a hesla z instance serveru SQL na serveru A instance serveru SQL Server na serveru B.
Přenést přihlášení, použijte jednu z následujících metod jako situace.
Metoda 1: Přihlaste se pomocí hesla pro SQL Server 2000
Chcete-li tento problém vyřešit, požádejte uživatele pro přihlášení k serveru, na kterém je spuštěn SQL Server pomocí přihlášení pre SQL Server 2000.
Poznámka: Algoritmus hash hesla se automaticky aktualizuje při přihlášení uživatele pomocí hesla pro SQL Server 2000.
Metoda 2: Obnovení hesla na serveru SQL Server
Chcete-li tento problém vyřešit, obnovení hesla na serveru SQL Server a potom mimo přihlašovací skript.
Poznámka: Používá algoritmus hash hesla při obnovení hesla.
Metoda 3: Vytvořte protokol ve skriptu, který má prázdné heslo
Chcete-li vytvořit protokol ve skriptu, který má prázdné heslo, postupujte takto:
Na server A spustit SQL Server Management Studio a připojte se k instanci serveru SQL Server, ze kterého přesunuta do databáze.
Otevřít nové okno editoru dotazu a spusťte následující skript.
USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary varbinary (256)
DECLARE @PWD_string varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)
DECLARE @defaultdb sysname
IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
IF (@type IN ( 'G', 'U'))
BEGIN -- NT authenticated account/group
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
END
ELSE BEGIN -- SQL Server authentication
-- obtain password and sid
SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
-- obtain password policy state
SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
IF ( @is_policy_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
END
IF ( @is_expiration_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
END
END
IF (@denylogin = 1)
BEGIN -- login is denied access
SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
END
ELSE IF (@hasaccess = 0)
BEGIN -- login exists but does not have access
SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
END
IF (@is_disabled = 1)
BEGIN -- login is disabled
SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
END
PRINT @tmpstr
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
Poznámka:Tento skript vytvoří dvě uložené procedury v hlavní databázi. Postupy jsou pojmenovány sp_hexadecimal a sp_help_revlogin.
Spusťte následující příkaz:
EXEC sp_help_revlogin
Výstupu skriptu, který generuje sp_help_revlogin uložené procedury je přihlašovací skript. Tento přihlašovací skript vytvoří přihlášení, která mají původní identifikátor zabezpečení (SID) a původní heslo.
Na serveru B spusťte SQL Server Management Studio a připojte se k instanci serveru SQL Server, ke kterému jste přesunuli do databáze.
Důležité Dříve než přejdete ke kroku 5, přečtěte si informace v části "Poznámky".
Otevřít nové okno editoru dotazu a potom spusťte skript výstup vytvořený v kroku 3.
Poznámky
Zkontrolujte následující informace před spuštěním skriptu výstup na instanci na server b
Pokud se pokusíte vytvořit nové přihlášení SQL Server 2012 pre-přihlášení k SQL Server 2000, je skriptovány, obdržíte následující chybě:
Msg 15021, úroveň 16, stav 2, řádek 1 Neplatná hodnota pro parametr heslo. Zadejte hodnotu pro parametr platný.
Poznámka: Tato chyba se zobrazí v SQL Server 2012 z důvodu hash hesla 16 bajtů, dodané k vytvoření přihlášení a změnit PŘIHLAŠOVACÍ prohlášení.
Chcete-li vyřešit tento problém na serveru se systémem SQL Server 2012, vytvořte přihlášení, který má prázdné heslo. Chcete-li to provést, spusťte následující skript:
CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF
Po vytvoření přihlášení, který má prázdné heslo, může uživatel změnit heslo při dalším pokusu o přihlášení.
Heslo můžete použít algoritmus hash třemi způsoby:
VERSION_LEGACY: Tento algoritmus hash je algoritmus hash 16 bajtů pre SQL Server 2000.
VERSION_SHA1: Tato hodnota hash je generován pomocí algoritmu SHA1 a používá se k serveru SQL Server 2000 pomocí SQL Server 2008 R2.
VERSION_SHA2: Tato hodnota hash je generován pomocí algoritmus SHA2 512 a je používán SQL Server 2012.
V SQL Server 2008 R1 a ve starších verzích byly podporovány pre SQL Server 2000 hesla zašifrovaná algoritmem hash. Pokud uživatel přihlášen pomocí hesla, které používá algoritmus hash pre SQL Server 2000, hodnota hash byl upgradován použít algoritmus hash SHA1 hesla.
Pokud uživatel, který má heslo, které používá hash pre SQL Server 2000 na serveru se systémem SQL Server 2008 R2, to znamená, že uživatel není přihlášen k tomuto serveru.
Pečlivě zkontrolujte výstup skriptu. A a server B jsou v různých doménách, je nutné změnit výstup skriptu. Potom je třeba nahradit původní název domény pomocí příkazů vytvořit PŘIHLAŠOVACÍ název nové domény. Integrované přihlášení, která je udělen přístup do nové domény v původní doméně nemají stejné SID jako přihlášení. Proto jsou uživatelé osamoceného z těchto přihlášení. Další informace o řešení těchto osamocené uživatelů klepněte na následující číslo článku databáze Microsoft Knowledge Base:
Jak vyřešit problémy oprávnění při přesunu databáze mezi servery se systémem SQL Server
Pokud A a server B ve stejné doméně, je použit stejný identifikátor SID. Proto jsou uživatelé pravděpodobně mít synchronní kopii.
Ve výstupu skriptu jsou vytvářeny pomocí šifrované heslo přihlášení. To je kvůli argument HASHED v příkazu vytvořit přihlášení. Tento argument určuje, že heslo zadané po argument heslo je zatříděna již.
Ve výchozím nastavení lze pouze člen role sysadmin dlouhodobého serveru spustit příkaz SELECT v sys.server_principals zobrazení. Pokud není členem sysadmin pevné role serveru uděluje potřebná oprávnění pro uživatele, uživatele nelze vytvořit, nebo spustit skript výstup.
Kroky v tomto článku k přenosu informací výchozí databáze pro konkrétní přihlášení. Důvodem je, že vždy výchozí databáze neexistuje na serveru B. Chcete-li definovat výchozí databáze pro přihlášení, použijte příkaz ALTER LOGIN předáním přihlašovací jméno a výchozí databáze jako argumenty.
Velká a malá písmena A a velká a malá písmena server B: pořadí řazení serveru A může být velká a malá písmena a může být malá a velká písmena řazení serveru B. V tomto případě uživatelé musí zadat heslo velkými písmeny po přenesení přihlášení a hesla k instanci na server B.
Velká a malá písmena A a velká a malá písmena server B: pořadí řazení serveru A může být malá a velká písmena a server B pořadí řazení může být velká a malá písmena. Uživatele nelze v tomto případě přihlásit pomocí uživatelská jména a hesla, které přenesete k instanci na server B, pokud je splněna jedna z následujících podmínek:
Původní hesla obsahovat žádná písmena.
Všechna písmena v původních hesel jsou velkými písmeny.
Rozlišovat malá a velká a malá písmena na obou serverech: může být malá a velká písmena řazení A i server B nebo pořadí řazení A i server B může být velká a malá písmena. V těchto případech nejsou uživatelé dojít k potížím.
Přihlášení, který je již v instanci na server B může mít název, který je stejný jako název v výstupu skriptu. V tomto případě se zobrazí následující chybová zpráva při spuštění skriptu výstup na instanci na server b
Zpráva 15025, úroveň 16 stav 1, řádek 1 Hlavní server "MyLogin' již existuje.
Obdobně může mít jedna přihlášení, které je již v instanci na server B SID, který je stejný jako identifikátor SID ve výstupu skriptu. V tomto případě se zobrazí následující chybová zpráva při spuštění skriptu výstup na instanci na server b
Msg 15433, úroveň 16 stav 1, řádek 1 Zadaný parametr sid je používán.
Proto je nutné provést následující:
Pečlivě zkontrolujte výstup skriptu.
Zkontrolujte obsah sys.server_principals zobrazení v instanci na server B.
Tyto chybové zprávy, případně adresa.
V SQL Server 2005 číslo SID pro přihlášení slouží k implementaci databáze úroveň přístupu. Přihlašovací jméno může mít jiný SID v různých databázích na serveru. V tomto případě přihlášení pouze přístup databázi, která má identifikátor SID odpovídající identifikátor SID v sys.server_principals zobrazení. K tomuto problému může dojít, pokud jsou dvě databáze kombinované z různých serverů. Chcete-li tento problém vyřešit, ručně odeberte přihlašovací jméno z databáze, která má pomocí příkazu DROP USER neshodě identifikátorů SID. Potom přihlášení znovu přidáte pomocí příkazu Vytvořit uživatele.
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.