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

Prevodi člankov Prevodi člankov
ID članka: 918992 - Oglejte si izdelke, na katere se nanaša ta članek.
Razširi vse | Zmanjšaj

Na tej strani

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 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
    
    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):
http://msdn2.microsoft.com/en-us/library/ms175475.aspx
Če želite več informacij o izjavi CREATE LOGIN, obiščite to spletno mesto MSDN:
http://msdn2.microsoft.com/en-us/library/ms189751.aspx
Če želite več informacij o izjavi ALTER LOGIN, obiščite to spletno mesto MSDN:
http://msdn2.microsoft.com/en-us/library/ms189828.aspx

Lastnosti

ID članka: 918992 - Zadnji pregled: 15. maj 2011 - Revizija: 3.0
VELJA ZA:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL 2005 Server Enterprise
Ključne besede: 
kbsqlmanagementtools kbexpertiseadvanced kbhowto kbinfo KB918992

Pošlji povratne informacije

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com