Trenutno nimate vzpostavljene povezave; čakanje, da se internetna povezava znova vzpostavi

Kako prenesti prijavna imena in gesla med primerki programa SQL Server 2005

UVOD
V članku je opisano, kako prenesete prijavna imena in gesla med primerki programa Microsoft SQL Server 2005 v različnih strežnikih.

Če želite več informacij o tem, kako prenesete prijavna imena in gesla med primerki drugih različic programa SQL Server, kliknite to številko članka iz Microsoftove zbirke znanja:
246133 Kako prenesti prijavna imena in gesla med primerki programa SQL Server (Ta povezava lahko vodi k besedilu, ki je delno ali v celoti v angleščini)
DODATNE INFORMACIJE
V tem članku sta strežnik A in strežnik B različna strežnika. V obeh se izvaja SQL Server 2005.

Ko zbirko podatkov premaknete iz primerka programa SQL Server v strežniku A v primerek programa SQL Server v strežniku B, se uporabniki morda ne bodo mogli prijaviti v zbirko podatkov v strežniku B. Poleg tega se lahko prikaže to sporočilo o napaki:
Login failed for user 'MyUser'. (Microsoft SQL Server, Error: 18456) (Prijava za uporabnika »MojUporabnik« ni uspela. (Microsoft SQL Server, napaka: 18456)).
Do te težave pride, ker niste prenesli prijavnih imen in gesel iz primerka programa SQL Server v strežniku A v primerek programa SQL v strežniku B.

Prijavna imena in gesla iz primerka programa SQL Server v strežniku A prenesete v primerek programa SQL Server v strežniku B tako:
  1. V strežniku A zaženite SQL Server Management Studio in vzpostavite povezavo s primerkom programa SQL Server, iz katerega ste premaknili zbirko podatkov.
  2. Odprite novo okno Query Editor (Urejevalnik poizvedbe) in zaženite ta skript.
    USE masterGOIF OBJECT_ID ('sp_hexadecimal') IS NOT NULL  DROP PROCEDURE sp_hexadecimalGOCREATE PROCEDURE sp_hexadecimal    @binvalue varbinary(256),    @hexvalue varchar (514) OUTPUTASDECLARE @charvalue varchar (514)DECLARE @i intDECLARE @length intDECLARE @hexstring char(16)SELECT @charvalue = '0x'SELECT @i = 1SELECT @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 + 1ENDSELECT @hexvalue = @charvalueGO IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL  DROP PROCEDURE sp_help_revloginGOCREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL ASDECLARE @name sysnameDECLARE @type varchar (1)DECLARE @hasaccess intDECLARE @denylogin intDECLARE @is_disabled intDECLARE @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_nameOPEN login_cursFETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denyloginIF (@@fetch_status = -1)BEGIN  PRINT 'No login(s) found.'  CLOSE login_curs  DEALLOCATE login_curs  RETURN -1ENDSET @tmpstr = '/* sp_help_revlogin script 'PRINT @tmpstrSET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'PRINT @tmpstrPRINT ''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   ENDCLOSE login_cursDEALLOCATE login_cursRETURN 0GO
    Opomba Ta skript ustvari dva shranjena postopka v glavni zbirki podatkov. Poimenovana sta sp_hexadecimal in sp_help_revlogin.
  3. Zaženite spodnjo izjavo.
    EXEC sp_help_revlogin
    Prikazani skript, ki ga ustvari shranjeni postopek sp_help_revlogin, je prijavni skript. Ta prijavni skript ustvari prijavna imena s prvotnim varnostnim identifikatorjem SID (Security Identifier) in prvotnim geslom.
  4. V strežniku B zaženite SQL Server Management Studio in vzpostavite povezavo s primerkom programa SQL Server, v katerega ste premaknili zbirko podatkov.

    Pomembno Preden začnete s 5. korakom, preglejte podatke v razdelku »Opombe«.
  5. Odprite novo okno Query Editor (Urejevalnik poizvedbe) in zaženite prikazani skript, ki je bil ustvarjen v 3. koraku.

Opombe

Preden zaženete prikazani skript v primerku v strežniku B, preglejte te informacije:
  • Pazljivo preglejte prikazani skript. Če sta strežnika A in B v različnih domenah, morate spremeniti prikazani skript. Nato prvotno ime domene nadomestite z novim imenom domene v izjavah CREATE LOGIN. Integrirana prijavna imena, ki imajo omogočen dostop v novi domeni, nimajo istega identifikatorja SID kot prijavna imena v prvotni domeni. Zato jih uporabniki ne morejo uporabljati. Če želite več informacij o odpravi težave osirotelih uporabnikov, kliknite to številko članka iz Microsoftove zbirke znanja:
    240872 Kako odpraviti težave z dovoljenji, ko premikate zbirko podatkov med strežniki, v katerih se izvaja SQL Server (Ta povezava lahko vodi k besedilu, ki je delno ali v celoti v angleščini)
    Če sta strežnika A in B v isti domeni, je uporabljen isti identifikator SID. Zato uporabniki najverjetneje ne bodo osiroteli.
  • V prikazanem skriptu so prijavna imena ustvarjena s šifriranim geslom. Vzrok za to je argument HASHED v izjavi CREATE LOGIN. Ta argument določa, da je geslo, vneseno za argumentom PASSWORD, že razpršeno.
  • Privzeto lahko izjavo SELECT iz pogleda sys.server_principals zažene le član popravljene vloge strežnika sysadmin. Če član popravljene vloge strežnika sysadmin uporabnikom ne dodeli potrebnih dovoljenj, uporabniki ne morejo ustvariti ali zagnati izhodnega skripta.
  • S koraki v tem članku se ne prenesejo privzete informacije zbirke podatkov za določeno prijavno ime. Vzrok za to je, da privzeta zbirka podatkov morda ne obstaja vedno v strežniku B. Če želite določiti privzeto zbirko podatkov za prijavno ime, uporabite izjavo ALTER LOGIN, tako da prijavno ime in privzeto zbirko podatkov navedete kot argumenta.
  • V vrstnem redu strežnika A morda ni ločevanja med malimi in velikimi črkami, v vrstnem redu strežnika B pa morda to ločevanje je. V tem primeru naj uporabniki vse črke v geslih napišejo z velikimi črkami, ko prenesete prijavna imena in gesla v primerek v strežniku B.

    Lahko pa v vrstnem redu strežnika A je ločevanje med malimi in velikimi črkami, v vrstnem redu strežnika B pa ga ni. V tem primeru se uporabniki ne morejo prijaviti s prijavnimi imeni in gesli, ki jih prenesete v primerek v strežniku B, razen če velja eden od teh pogojev:
    • Prvotna gesla ne vsebujejo črk.
    • Vse črke v prvotnih geslih so velike.
    V vrstnem redu v strežnikih A in B je morda ločevanje med velikimi in malimi črkami, morda pa ga v obeh strežnikih ni. V teh primerih ne pride do nobene težave.
  • Prijavno ime, ki je že v primerku v strežniku B, je morda enako kot ime v prikazanem skriptu. V tem primeru se prikaže to sporočilo o napaki, ko zaženete prikazani skript v primerku strežnika B:
    Msg 15025, Level 16, State 1, Line 1
    The server principal 'MyLogin' already exists. (Sporočilo 15025, raven 16, stanje 1, vrstica 1. Glavno ime »MojePrijavnoIme« v strežniku že obstaja.)
    Podobno ima prijavno ime, ki je že v primerku v strežniku B, morda enak identifikator SID kot SID v prikazanem skriptu. V tem primeru se prikaže to sporočilo o napaki, ko zaženete prikazani skript v primerku strežnika B:
    Msg 15433, Level 16, State 1, Line 1
    Supplied parameter sid is in use. (Sporočilo 15433, raven 16, stanje 1, vrstica 1. Navedeni sid parametra je v uporabi.)
    Naredite to:
    1. Pazljivo preglejte prikazani skript.
    2. Preglejte vsebino pogleda sys.server_principals v primerku v strežniku B.
    3. Ustrezno odpravite ta sporočila o napaki.
  • V programu SQL Server 2005 je SID za prijavno ime uporabljen kot osnova za uveljavljanje dostopa na ravni zbirke podatkov. Prijavno ime ima lahko dva različna identifikatorja SID v dveh različnih zbirkah podatkov v strežniku. V tem primeru lahko s prijavnim imenom dostopate le do zbirke podatkov z identifikatorjem SID, ki se ujema z identifikatorjem SID v pogledu sys.server_principals. Do te težave lahko pride, če sta dve zbirki podatkov usklajeni iz dveh različnih strežnikov. Težavo odpravite tako, da ročno odstranite prijavno ime iz zbirke podatkov, v kateri je neujemajoči se SID, in sicer z izjavo DROP USER. Nato prijavno ime znova dodajte z izjavo CREATE USER.
SKLICI
Več informacij o odpravljanju težav z osirotelimi uporabniki najdete na tem spletnem mestu Microsoft Developer Network (MSDN): Če želite več informacij o izjavi CREATE LOGIN, obiščite to spletno mesto MSDN: Če želite več informacij o izjavi ALTER LOGIN, obiščite to spletno mesto MSDN:
Lastnosti

ID članka: 918992 – Zadnji pregled: 05/15/2011 09:13:00 – Revizija: 3.0

  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL 2005 Server Enterprise
  • kbsqlmanagementtools kbexpertiseadvanced kbhowto kbinfo KB918992
Povratne informacije
ft.com/ms.js"> pt>