Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Oorspronkelijke productversie: SQL Server
Oorspronkelijk KB-nummer: 918992, 246133
Samenvatting
In dit artikel wordt beschreven hoe u SQL Server aanmeldingen en wachtwoorden overdraagt tussen exemplaren van Microsoft SQL Server die worden uitgevoerd op Windows. Gebruik deze procedures tijdens SQL Server migratie-, herstel- of hoge beschikbaarheidsscenario's om gebruikersverificatie intact te houden en zwevende databasegebruikers op het doelexemplaren te voorkomen. De bron- en doelexemplaren kunnen zich op dezelfde server of op verschillende servers bevinden en hun versies kunnen verschillen.
Waarom aanmeldingen overdragen tussen SQL Server exemplaren
Wanneer u een database verplaatst naar een nieuwe server, bijvoorbeeld tijdens een migratie of herstel, worden de databasegebruikers verplaatst met de database, maar de overeenkomende aanmeldingen op serverniveau zijn mogelijk niet aanwezig op het nieuwe exemplaar. Die mismatch leidt tot verweesde gebruikers. Als u aanmeldingen en wachtwoorden overdraagt, blijft gebruikersverificatie intact en voorkomt u aanmeldingsonderbrekingen na het verplaatsen van een database.
Nadat u een database hebt verplaatst van een SQL Server-exemplaar op server A naar een SQL Server-exemplaar op server B, kunnen gebruikers zich mogelijk niet aanmelden bij de databaseserver op server B. Bovendien kunnen gebruikers mogelijk het volgende foutbericht krijgen:
Aanmelden is mislukt voor gebruiker 'MyUser'. (Microsoft SQL-server, fout: 18456)
Dit probleem treedt op omdat de aanmeldingen van het SQL Server-exemplaar op server A niet bestaan in het SQL Server-exemplaar op server B.
Fout 18456 kan ook om verschillende andere redenen optreden. Zie MSSQLSERVER_18456 voor meer informatie over de verschillende oorzaken en hun oplossingen.
Methoden voor het overdragen van aanmeldingen tussen SQL Server exemplaren
Als u aanmeldingen wilt overdragen, gebruikt u een van de volgende methoden, afhankelijk van uw situatie.
Aanmeldingsscripts genereren in SSMS en wachtwoorden opnieuw instellen op de bestemming
U kunt aanmeldingsscripts genereren in SQL Server Management Studio (SSMS) met behulp van de optie Scripts genereren voor een database.
Als u scripts wilt genereren via SSMS op de bronserver en wachtwoorden handmatig opnieuw wilt instellen voor SQL Server-aanmeldingen op de doelserver, voert u de volgende stappen uit:
Maak verbinding met server A die als host fungeert voor de bron-SQL Server.
Vouw het knooppunt Databases uit.
Houd een willekeurige gebruikersdatabase ingedrukt (of klik er met de rechtermuisknop op) en selecteer vervolgens Taken>Scripts genereren.
De introductiepagina wordt geopend. Selecteer Volgende om de pagina Objecten kiezen te openen. Selecteer Hele scriptdatabase en alle databaseobjecten.
Selecteer Volgende om de pagina Scriptingopties instellen te openen.
Selecteer de knop Geavanceerd voor aanmeldingsopties voor scripts.
Zoek in de Geavanceerd-lijst naar Scriptaanmeldingen, stel de optie in op Waar en selecteer OK.
Ga terug naar Scriptopties instellen, onder Selecteren hoe scripts moeten worden opgeslagen , selecteer Openen in het nieuwe queryvenster.
Selecteer Volgende twee keer en selecteer vervolgens Voltooien.
Zoek de sectie in het script met aanmeldingen. Normaal gesproken bevat het gegenereerde script tekst met de volgende opmerking aan het begin van deze sectie:
/* For security reasons the login is created disabled and with a random password. */Notitie
Deze opmerking geeft aan dat aanmeldingen voor SQL Server-verificatie worden gegenereerd met een willekeurig wachtwoord en standaard zijn uitgeschakeld. U moet het wachtwoord opnieuw instellen en deze aanmeldingen opnieuw inschakelen op de doelserver.
Pas het aanmeldingsscript van het grotere gegenereerde script toe op de doel-SQL Server.
Voor aanmeldingen met SQL Server-verificatie stelt u het wachtwoord opnieuw in op de doel-SQL Server en schakelt u deze aanmeldingen opnieuw in.
Aanmeldingen en wachtwoorden overdragen met behulp van sp_help_revlogin
Maak opgeslagen procedures waarmee u de benodigde scripts kunt genereren om aanmeldingen en hun wachtwoorden over te dragen. Hiervoor maakt u verbinding met Server A met behulp van SQL Server Management Studio (SSMS) of een ander clienthulpprogramma en voert u het volgende script uit:
USE [master] GO IF OBJECT_ID('dbo.sp_hexadecimal') IS NOT NULL DROP PROCEDURE dbo.sp_hexadecimal GO CREATE PROCEDURE dbo.sp_hexadecimal @binvalue [varbinary](256) ,@hexvalue [nvarchar] (514) OUTPUT AS BEGIN DECLARE @i [smallint] DECLARE @length [smallint] DECLARE @hexstring [nchar](16) SELECT @hexvalue = N'0x' SELECT @i = 1 SELECT @length = DATALENGTH(@binvalue) SELECT @hexstring = N'0123456789ABCDEF' WHILE (@i < = @length) BEGIN DECLARE @tempint [smallint] DECLARE @firstint [smallint] DECLARE @secondint [smallint] SELECT @tempint = CONVERT([smallint], SUBSTRING(@binvalue, @i, 1)) SELECT @firstint = FLOOR(@tempint / 16) SELECT @secondint = @tempint - (@firstint * 16) SELECT @hexvalue = @hexvalue + SUBSTRING(@hexstring, @firstint + 1, 1) + SUBSTRING(@hexstring, @secondint + 1, 1) SELECT @i = @i + 1 END END GO IF OBJECT_ID('dbo.sp_help_revlogin') IS NOT NULL DROP PROCEDURE dbo.sp_help_revlogin GO CREATE PROCEDURE dbo.sp_help_revlogin @login_name [sysname] = NULL AS BEGIN DECLARE @name [sysname] DECLARE @type [nvarchar](1) DECLARE @hasaccess [int] DECLARE @denylogin [int] DECLARE @is_disabled [int] DECLARE @PWD_varbinary [varbinary](256) DECLARE @PWD_string [nvarchar](514) DECLARE @SID_varbinary [varbinary](85) DECLARE @SID_string [nvarchar](514) DECLARE @tmpstr [nvarchar](4000) DECLARE @is_policy_checked [nvarchar](3) DECLARE @is_expiration_checked [nvarchar](3) DECLARE @Prefix [nvarchar](4000) DECLARE @defaultdb [sysname] DECLARE @defaultlanguage [sysname] DECLARE @tmpstrRole [nvarchar](4000) IF @login_name IS NULL BEGIN DECLARE login_curs CURSOR FOR SELECT p.[sid],p.[name],p.[type],p.is_disabled,p.default_database_name,l.hasaccess,l.denylogin,default_language_name = ISNULL(p.default_language_name,@@LANGUAGE) FROM sys.server_principals p LEFT JOIN sys.syslogins l ON l.[name] = p.[name] WHERE p.[type] IN ('S' /* SQL_LOGIN */,'G' /* WINDOWS_GROUP */,'U' /* WINDOWS_LOGIN */) AND p.[name] <> 'sa' AND p.[name] not like '##%' ORDER BY p.[name] END ELSE DECLARE login_curs CURSOR FOR SELECT p.[sid],p.[name],p.[type],p.is_disabled,p.default_database_name,l.hasaccess,l.denylogin,default_language_name = ISNULL(p.default_language_name,@@LANGUAGE) FROM sys.server_principals p LEFT JOIN sys.syslogins l ON l.[name] = p.[name] WHERE p.[type] IN ('S' /* SQL_LOGIN */,'G' /* WINDOWS_GROUP */,'U' /* WINDOWS_LOGIN */) AND p.[name] <> 'sa' AND p.[name] NOT LIKE '##%' AND p.[name] = @login_name ORDER BY p.[name] OPEN login_curs FETCH NEXT FROM login_curs INTO @SID_varbinary,@name,@type,@is_disabled,@defaultdb,@hasaccess,@denylogin,@defaultlanguage IF (@@fetch_status = - 1) BEGIN PRINT '/* No login(s) found for ' + QUOTENAME(@login_name) + N'. */' CLOSE login_curs DEALLOCATE login_curs RETURN - 1 END SET @tmpstr = N'/* sp_help_revlogin script ** Generated ' + CONVERT([nvarchar], GETDATE()) + N' on ' + @@SERVERNAME + N' */' PRINT @tmpstr WHILE (@@fetch_status <> - 1) BEGIN IF (@@fetch_status <> - 2) BEGIN PRINT '' SET @tmpstr = N'/* Login ' + QUOTENAME(@name) + N' */' PRINT @tmpstr SET @tmpstr = N'IF NOT EXISTS ( SELECT 1 FROM sys.server_principals WHERE [name] = N''' + @name + N''' ) BEGIN' PRINT @tmpstr IF @type IN ('G','U') -- NT-authenticated Group/User BEGIN -- NT authenticated account/group SET @tmpstr = N' CREATE LOGIN ' + QUOTENAME(@name) + N' FROM WINDOWS WITH DEFAULT_DATABASE = ' + QUOTENAME(@defaultdb) + N' ,DEFAULT_LANGUAGE = ' + QUOTENAME(@defaultlanguage) END ELSE BEGIN -- SQL Server authentication -- obtain password and sid SET @PWD_varbinary = CAST(LOGINPROPERTY(@name, 'PasswordHash') AS [varbinary](256)) EXEC dbo.sp_hexadecimal @PWD_varbinary, @PWD_string OUT EXEC dbo.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 = NCHAR(9) + N'CREATE LOGIN ' + QUOTENAME(@name) + N' WITH PASSWORD = ' + @PWD_string + N' HASHED ,SID = ' + @SID_string + N' ,DEFAULT_DATABASE = ' + QUOTENAME(@defaultdb) + N' ,DEFAULT_LANGUAGE = ' + QUOTENAME(@defaultlanguage) IF @is_policy_checked IS NOT NULL BEGIN SET @tmpstr = @tmpstr + N' ,CHECK_POLICY = ' + @is_policy_checked END IF @is_expiration_checked IS NOT NULL BEGIN SET @tmpstr = @tmpstr + N' ,CHECK_EXPIRATION = ' + @is_expiration_checked END END IF (@denylogin = 1) BEGIN -- login is denied access SET @tmpstr = @tmpstr + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'DENY CONNECT SQL TO ' + QUOTENAME(@name) END ELSE IF (@hasaccess = 0) BEGIN -- login exists but does not have access SET @tmpstr = @tmpstr + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'REVOKE CONNECT SQL TO ' + QUOTENAME(@name) END IF (@is_disabled = 1) BEGIN -- login is disabled SET @tmpstr = @tmpstr + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'ALTER LOGIN ' + QUOTENAME(@name) + N' DISABLE' END SET @Prefix = NCHAR(13) + NCHAR(10) + NCHAR(9) + N'' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'EXEC [master].dbo.sp_addsrvrolemember @loginame = N''' SET @tmpstrRole = N'' SELECT @tmpstrRole = @tmpstrRole + CASE WHEN sysadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''sysadmin''' ELSE '' END + CASE WHEN securityadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''securityadmin''' ELSE '' END + CASE WHEN serveradmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''serveradmin''' ELSE '' END + CASE WHEN setupadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''setupadmin''' ELSE '' END + CASE WHEN processadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''processadmin''' ELSE '' END + CASE WHEN diskadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''diskadmin''' ELSE '' END + CASE WHEN dbcreator = 1 THEN @Prefix + LoginName + N''', @rolename = N''dbcreator''' ELSE '' END + CASE WHEN bulkadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''bulkadmin''' ELSE '' END FROM ( SELECT SUSER_SNAME([sid])AS LoginName ,sysadmin ,securityadmin ,serveradmin ,setupadmin ,processadmin ,diskadmin ,dbcreator ,bulkadmin FROM sys.syslogins WHERE ( sysadmin <> 0 OR securityadmin <> 0 OR serveradmin <> 0 OR setupadmin <> 0 OR processadmin <> 0 OR diskadmin <> 0 OR dbcreator <> 0 OR bulkadmin <> 0 ) AND [name] = @name ) L IF @tmpstr <> '' PRINT @tmpstr IF @tmpstrRole <> '' PRINT @tmpstrRole PRINT 'END' END FETCH NEXT FROM login_curs INTO @SID_varbinary,@name,@type,@is_disabled,@defaultdb,@hasaccess,@denylogin,@defaultlanguage END CLOSE login_curs DEALLOCATE login_curs RETURN 0 ENDNotitie
Met dit script worden twee opgeslagen procedures in de hoofddatabase gemaakt. De procedures worden sp_hexadecimal en sp_help_revlogin genoemd.
Selecteer in de SSMS-queryeditor de optie Resultaten naar tekst .
Voer de volgende instructie uit in hetzelfde of een nieuw queryvenster:
EXEC sp_help_revloginHet uitvoerscript dat door de
sp_help_revloginopgeslagen procedure wordt gegenereerd, is het aanmeldingsscript. Met dit aanmeldingsscript worden de aanmeldingen gemaakt met de oorspronkelijke beveiligings-id (SID) en het oorspronkelijke wachtwoord.Bekijk en volg de informatie in de sectie Aanvullende overwegingen bij het overdragen van SQL Server-aanmeldingen voordat u verdergaat met het implementeren van stappen op de doelserver.
Zodra u alle toepasselijke stappen hebt uitgevoerd in de sectie Aanvullende overwegingen bij het overdragen van SQL Server aanmeldingen, maakt u verbinding met de doelserver B met behulp van een clienthulpprogramma (zoals SSMS).
Voer op server A het script uit dat is gegenereerd als resultaat van
sp_helprevlogin.
Aanvullende overwegingen bij het overdragen van SQL Server-aanmeldingen
Lees de volgende informatie voordat u het uitvoerscript uitvoert op het exemplaar op server B:
Inzicht in wachtwoord-hashing in SQL Server-aanmeldingsoverdrachten
SQL Server hasht wachtwoorden op de volgende manieren:
-
VERSION_SHA1: maakt gebruik van het SHA1-algoritme. SQL Server 2000 tot en met SQL Server 2008 R2 gebruiken deze hash. Deze versies worden niet meer regulier of uitgebreid ondersteund, dus u zult hashesVERSION_SHA1alleen tegenkomen wanneer u van verouderde instanties wegmigreert. -
VERSION_SHA2: maakt gebruik van het SHA2-512-algoritme. SQL Server 2012 en latere versies, inclusief momenteel ondersteunde releases, gebruiken deze hash.
Met het uitvoerscript worden de aanmeldingen gemaakt met behulp van het versleutelde wachtwoord. Het HASHED argument in de instructie CREATE LOGIN veroorzaakt dit gedrag. Dit argument geeft aan dat het wachtwoord dat is ingevoerd nadat het PASSWORD argument al is gehasht.
Domeinwijzigingen verwerken tijdens aanmeldingsoverdrachten van SQL Server
Als uw bron- en doelservers zich in verschillende domeinen bevinden, controleert u het uitvoerscript zorgvuldig. Wijzig het script om de oorspronkelijke domeinnaam te vervangen door de nieuwe domeinnaam in de CREATE LOGIN instructies. Geïntegreerde aanmeldingen waaraan in het nieuwe domein toegang is verleend, hebben niet dezelfde SID als de aanmeldingen in het oorspronkelijke domein, waardoor gebruikers niet meer aan deze aanmeldingen zijn gekoppeld. Zie Problemen met verweesde gebruikers oplossen (SQL Server) en ALTER USER voor het oplossen van verweesde gebruikers.
Als server A en server B zich in hetzelfde domein bevinden, wordt dezelfde SID gebruikt. Daarom zijn gebruikers niet verlaten.
Vereiste machtigingen voor het weergeven en selecteren van SQL Server-aanmeldingen
Standaard kunnen alleen leden van de vaste serverrol sysadmin een SELECT-instructie uitvoeren op de sys.server_principals-weergave. Tenzij een systeembeheerder de benodigde machtigingen verleent aan andere gebruikers, kunnen deze gebruikers het uitvoerscript niet maken of uitvoeren.
De standaarddatabase-instelling wordt niet opgenomen in het script en niet overgebracht
Met de stappen in dit artikel worden de standaarddatabasegegevens voor een bepaalde aanmelding niet overgedragen. Deze beperking bestaat omdat de standaarddatabase mogelijk niet altijd bestaat op server B. Als u de standaarddatabase voor een aanmelding wilt definiëren, gebruikt u de instructie ALTER LOGIN door de aanmeldingsnaam en de standaarddatabase als argumenten door te geven.
Verschillen in sorteervolgorde beheren in sql Server-aanmeldingsoverdrachten
De bron- en doelservers hebben mogelijk verschillende sorteervolgordes of ze gebruiken dezelfde sorteervolgorde. U kunt elk scenario als volgt aanpakken:
Niet-hoofdlettergevoelige server A en hoofdlettergevoelige server B: De sorteervolgorde van server A is niet hoofdlettergevoelig en de sorteervolgorde van server B is hoofdlettergevoelig. In dit geval moeten gebruikers de wachtwoorden in hoofdletters typen nadat u de aanmeldingen en de wachtwoorden hebt overgedragen naar het exemplaar op server B.
Hoofdlettergevoelige server A en niet-hoofdlettergevoelige server B: De sorteervolgorde van server A is hoofdlettergevoelig en de sorteervolgorde van server B is niet hoofdlettergevoelig. In dit geval kunnen gebruikers zich niet aanmelden met behulp van de aanmeldingen en de wachtwoorden die u overbrengt naar het exemplaar op server B, tenzij aan een van de volgende voorwaarden is voldaan:
- De oorspronkelijke wachtwoorden bevatten geen letters.
- Alle letters in de oorspronkelijke wachtwoorden zijn hoofdletters.
Hoofdlettergevoelig of niet hoofdlettergevoelig op beide servers: Zowel server A als server B gebruiken een hoofdlettergevoelige sorteervolgorde, of beide gebruiken een niet-hoofdlettergevoelige sorteervolgorde. In deze gevallen ondervinden de gebruikers geen probleem.
Conflicten met bestaande aanmeldingen op de doelserver oplossen
Het script controleert of de aanmelding op de doelserver bestaat en maakt alleen een aanmelding als deze niet bestaat. Als u echter het volgende foutbericht ontvangt wanneer u het uitvoerscript uitvoert op het exemplaar op server B, moet u het conflict handmatig oplossen door de stappen in deze sectie te volgen.
Msg 15025, Niveau 16, Staat 1, Regel 1
De server-principal 'MyLogin' bestaat al.
Op dezelfde manier kan een login die al in de instantie op server B aanwezig is, een SID hebben die gelijk is aan een SID in het uitvoerscript. In dit geval ontvangt u het volgende foutbericht wanneer u het uitvoerscript uitvoert op het exemplaar op server B:
Msg 15433, Level 16, State 1, Line 1 De opgegeven parameter sid is in gebruik.
Volg deze stappen om het conflict handmatig op te lossen:
- Lees het uitvoerscript zorgvuldig.
- Bekijk de inhoud van de
sys.server_principalsweergave in het exemplaar op server B. - Voer de juiste actie uit voor elke fout, zoals het verwijderen of hernoemen van de conflicterende aanmelding op server B of het verwijderen van de dubbele
CREATE LOGINinstructie uit het uitvoerscript voordat u deze opnieuw uitvoert.
In SQL Server bepaalt de SID voor een aanmelding toegang op databaseniveau. Een aanmelding kan verschillende SID's hebben wanneer deze is toegewezen aan gebruikers in verschillende databases. Dit kan gebeuren als u databases van verschillende servers handmatig combineert. In dat geval kan de aanmelding alleen gebruikmaken van de database waarin de SID van de database-principal overeenkomt met de SID in de sys.server_principals weergave. U kunt dit probleem oplossen door de databasegebruiker met de niet-overeenkomende SID te verwijderen met behulp van de instructie DROP USER . Voeg vervolgens de gebruiker opnieuw toe met de instructie CREATE USER en wijs deze toe aan de juiste login (server-principal).
Zie CREATE USER en CREATE LOGIN voor meer informatie over server- en database-principals.
Geavanceerde scenario’s en problemen oplossen
Als u aanmeldingsfouten blijft zien nadat u aanmeldingen hebt overgedragen, controleert u de volgende items:
-
Niet-gekoppelde databasegebruikers: Voer
sys.sp_change_users_loginuit (verouderd) of gebruikALTER USER ... WITH LOGIN = ...om databasegebruikers opnieuw te koppelen aan de overgedragen aanmeldaccounts. Zie Problemen met zwevende gebruikers (SQL Server) oplossen voor meer informatie. -
Ingesloten databases: de database zelf slaat aanmeldingen op voor gebruikers in een ingesloten database, zodat ze ermee kunnen navigeren. U hoeft deze gebruikers niet over te dragen met behulp van
sp_help_revlogin. - AlwaysOn-beschikbaarheidsgroepen en failoverclusterexemplaren: breng aanmeldingen over naar elke replica of elk knooppunt, zodat gebruikers zich kunnen aanmelden na een failover. Zie Aanmeldingen beheren voor taken met behulp van databases in een AlwaysOn-beschikbaarheidsgroep voor meer informatie.
- Azure SQL Managed Instance en Azure SQL Database: aanmeldingsoverdracht werkt anders in Azure. Zie Aanmeldingen migreren tussen SQL Server en SQL Managed Instanceen Aanmeldingen en gebruikers beheren in Azure SQL Database.
- Aanmeldingsfout 18456: Zie MSSQLSERVER_18456 voor andere oorzaken en oplossingen.