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

Vaš brskalnik ni podprt

Če želite uporabljati spletno mesto, morate posodobiti brskalnik.

Posodobite brskalnik na najnovejšo različico aplikacije Internet Explorer

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
rosoft.com/c.gif?DI=4050&did=1&t="> var Route = "76500"; var Ctrl = ""; document.write(" /javascript' src='" + (window.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");