Τρόπος μεταφοράς συνδέσεων και κωδικών πρόσβασης μεταξύ εμφανίσεων του SQL Server

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 246133 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Μετά από τη μετακίνηση βάσεων δεδομένων σε ένα νέο διακομιστή, οι χρήστες ενδέχεται να μην είναι σε θέση να συνδεθούν με το νέο διακομιστή. Αντίθετα, εμφανίζεται το ακόλουθο μήνυμα λάθους:
Msg 18456, Level 16, State 1
Login failed for user '%ls'.
Πρέπει να μεταφέρετε τις συνδέσεις και τους κωδικούς πρόσβασης στο νέο διακομιστή. Αυτό το άρθρο περιγράφει τον τρόπο μεταφοράς συνδέσεων και κωδικών πρόσβασης σε νέο διακομιστή.

Τρόπος μεταφοράς συνδέσεων και κωδικών πρόσβασης μεταξύ διακομιστών που χρησιμοποιούν SQL Server 7.0

Η δυνατότητα μεταφοράς αντικειμένων (Object Transfer) DTS (Data Transformation Services) του SQL Server 7.0 μεταφέρει συνδέσεις και χρήστες μεταξύ δύο διακομιστών, αλλά δεν μεταφέρει τους κωδικούς πρόσβασης για τις συνδέσεις του SQL Server που έχουν υποβληθεί σε έλεγχο ταυτότητας. Για να μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από ένα διακομιστή που χρησιμοποιεί SQL Server 7.0 σε έναν άλλο διακομιστή που χρησιμοποιεί επίσης SQL Server 7.0, ακολουθήστε τα βήματα που αναφέρονται στην ενότητα "Πλήρης λύση για τη μεταφορά συνδέσεων και κωδικών πρόσβασης μεταξύ διαφορετικών εκδόσεων του SQL Server".

Τρόπος μεταφοράς συνδέσεων και κωδικών πρόσβασης από τον SQL Server 7.0 στον SQL Server 2000 ή μεταξύ διακομιστών που χρησιμοποιούν SQL Server 2000

Για να μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από ένα διακομιστή SQL Server 7.0 σε μια εμφάνιση του SQL Server 2000 ή μεταξύ δύο εμφανίσεων του SQL Server 2000, μπορείτε να χρησιμοποιήσετε τη δυνατότητα DTS Package Transfer Logins Task στον SQL Server 2000. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα:
  1. Συνδεθείτε με το διακομιστή προορισμού με SQL Server 2000, μετακινηθείτε στον Data Transformation Services in SQL Server Enterprise Manager, αναπτύξτε το φάκελο, κάντε δεξιό κλικ στην επιλογή Πακέτα τοπικών ρυθμίσεων (Local Packages) και, στη συνέχεια, κάντε κλικ στην επιλογή Νέο πακέτο (New Package).
  2. Μετά το άνοιγμα του σχεδιαστή πακέτων DTS, κάντε κλικ στην επιλογή Εργασία μεταφοράς συνδέσεων (Transfer Logins Task) στο μενού Εργασία (Task). Συμπληρώστε τις πληροφορίες σχετικά με τις καρτέλες Προέλευση (Source), Προορισμός (Destination) και Συνδέσεις (Logins), ανάλογα με την περίπτωσή σας.

    Σημαντικό Ο διακομιστής προορισμού SQL Server 2000 δεν είναι σε θέση να εκτελέσει την έκδοση 64-bit του SQL Server 2000. Τα στοιχεία DTS για την έκδοση 64-bit του SQL Server 2000 δεν είναι διαθέσιμα. Στην περίπτωση που εισαγάγετε συνδέσεις από μια εμφάνιση του SQL Server η οποία βρίσκεται σε ξεχωριστό υπολογιστή, για να ολοκληρωθεί η εργασία, η εμφάνιση του SQL Server πρέπει να εκτελείται σε λογαριασμό τομέα (Domain Account).

    Σημείωση Η μέθοδος DTS θα μεταφέρει τους κωδικούς πρόσβασης αλλά όχι το πρωτότυπο SID. Εάν μια σύνδεση δεν δημιουργηθεί με τη χρήση του πρωτότυπου SID και οι βάσεις δεδομένων μεταφέρονται επίσης στο νέο διακομιστή, οι χρήστες της βάσης δεδομένων θα μείνουν ορφανοί από σύνδεση. Για να μεταφέρετε το αρχικό SID και να παρακάμψετε τους ορφανούς χρήστες, ακολουθήστε τα βήματα της ενότητας "Πλήρης λύση για τη μεταφορά συνδέσεων και κωδικών πρόσβασης μεταξύ διαφορετικών εκδόσεων του SQL Server".

Τρόπος μεταφοράς συνδέσεων και κωδικών πρόσβασης μεταξύ εμφανίσεων του SQL Server 2005

Για περισσότερες πληροφορίες σχετικά με τον τρόπο μεταφοράς των συνδέσεων και των κωδικών πρόσβασης μεταξύ εμφανίσεων του SQL Server 2005, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής βάσης της Microsoft (Knowledge Base):
918992 Τρόπος μεταφοράς των συνδέσεων και των κωδικών πρόσβασης μεταξύ εμφανίσεων του SQL Server 2005

Πλήρης λύση για τη μεταφορά συνδέσεων και κωδικών πρόσβασης μεταξύ διαφορετικών εκδόσεων του SQL Server

Για να γίνει αυτό, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους.
Σημειώσεις (Notes)
  • Οι δέσμες ενεργειών που περιγράφονται στις ακόλουθες μεθόδους δημιουργούν δύο αποθηκευμένες διαδικασίες, οι οποίες ονομάζονται αποθηκευμένη διαδικασία sp_hexadecimal και αποθηκευμένη διαδικασία sp_help_revlogin στη βάση δεδομένων master.
  • Οι δέσμες ενεργειών εξαρτώνται από τους πίνακες του συστήματος SQL Server. Η δομή αυτών των πινάκων ενδέχεται να αλλάζει μεταξύ των εκδόσεων του SQL Server. Δεν συνιστάται η επιλογή απευθείας από τους πίνακες του συστήματος.
  • Εξετάστε τα σχόλια στο τέλος αυτού του άρθρου για να βρείτε σημαντικές πληροφορίες σχετικά με τα βήματα που αναφέρονται σε αυτές τις μεθόδους.
  • Η μέθοδος 2 εκχωρεί συνδέσεις σε ρόλους.

Μέθοδος 1

Αυτή η μέθοδος ισχύει για τα ακόλουθα σενάρια:
  • Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από τον SQL Server 7.0 στον SQL Server 7.0.
  • Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από τον SQL Server 7.0 στον SQL Server 2000.
  • Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης μεταξύ διακομιστών που χρησιμοποιούν SQL Server 2000.
Για να μεταφέρετε συνδέσεις και κωδικούς πρόσβασης μεταξύ διαφορετικών συνδέσεων του SQL Server, ακολουθήστε τα εξής βήματα:
  1. Εκτελέστε την ακόλουθη δέσμη ενεργειών στην προέλευση του SQL Server. Συνεχίστε με το βήμα 2 μόλις ολοκληρώσετε τη δημιουργία της αποθηκευμένης διαδικασίας sp_help_revlogin.
    ----- Begin Script, Create sp_help_revlogin procedure -----
    
    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(256) OUTPUT
    AS
    DECLARE @charvalue varchar(256)
    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 @xstatus int
    DECLARE @binpwd  varbinary (256)
    DECLARE @txtpwd  sysname
    DECLARE @tmpstr  varchar (256)
    DECLARE @SID_varbinary varbinary(85)
    DECLARE @SID_string varchar(256)
    
    IF (@login_name IS NULL)
      DECLARE login_curs CURSOR FOR 
        SELECT sid, name, xstatus, password FROM master..sysxlogins 
        WHERE srvid IS NULL AND name <> 'sa'
    ELSE
      DECLARE login_curs CURSOR FOR 
        SELECT sid, name, xstatus, password FROM master..sysxlogins 
        WHERE srvid IS NULL AND name = @login_name
    OPEN login_curs 
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
    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 ''
    PRINT 'DECLARE @pwd sysname'
    WHILE (@@fetch_status <> -1)
    BEGIN
      IF (@@fetch_status <> -2)
      BEGIN
        PRINT ''
        SET @tmpstr = '-- Login: ' + @name
        PRINT @tmpstr 
        IF (@xstatus & 4) = 4
        BEGIN -- NT authenticated account/group
          IF (@xstatus & 1) = 1
          BEGIN -- NT login is denied access
            SET @tmpstr = 'EXEC master..sp_denylogin ''' + @name + ''''
            PRINT @tmpstr 
          END
          ELSE BEGIN -- NT login has access
            SET @tmpstr = 'EXEC master..sp_grantlogin ''' + @name + ''''
            PRINT @tmpstr 
          END
        END
        ELSE BEGIN -- SQL Server authentication
          IF (@binpwd IS NOT NULL)
          BEGIN -- Non-null password
            EXEC sp_hexadecimal @binpwd, @txtpwd OUT
            IF (@xstatus & 2048) = 2048
              SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')'
            ELSE
              SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')'
            PRINT @tmpstr
    	EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
            SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name 
              + ''', @pwd, @sid = ' + @SID_string + ', @encryptopt = '
          END
          ELSE BEGIN 
            -- Null password
    	EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
            SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name 
              + ''', NULL, @sid = ' + @SID_string + ', @encryptopt = '
          END
          IF (@xstatus & 2048) = 2048
            -- login upgraded from 6.5
            SET @tmpstr = @tmpstr + '''skip_encryption_old''' 
          ELSE 
            SET @tmpstr = @tmpstr + '''skip_encryption'''
          PRINT @tmpstr 
        END
      END
      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
      END
    CLOSE login_curs 
    DEALLOCATE login_curs 
    RETURN 0
    GO
     ----- End Script -----
    
    
  2. Μετά τη δημιουργία της αποθηκευμένης διαδικασίας sp_help_revlogin, εκτελέστε τη διαδικασία sp_help_revlogin από τον Query Analyzer στο διακομιστή προέλευσης. Η αποθηκευμένη διαδικασία sp_help_revlogin μπορεί να χρησιμοποιηθεί τόσο στον SQL Server 7.0 όσο και στον SQL Server 2000. Το αποτέλεσμα της αποθηκευμένης διαδικασίας sp_help_revlogin είναι δέσμες ενεργειών σύνδεσης, οι οποίες δημιουργούν συνδέσεις με το πρωτότυπο SID και κωδικό πρόσβασης. Αποθηκεύστε το αποτέλεσμα και, στη συνέχεια, επικολλήστε και εκτελέστε τον στον Query Analyzer στον SQL Server προορισμού. Για παράδειγμα:
     EXEC master..sp_help_revlogin 

Μέθοδος 2

Αυτή η μέθοδος ισχύει για τα ακόλουθα σενάρια:
  • Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από τον SQL Server 7.0 στον SQL Server 2005.
  • Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από τον SQL Server 2000 στον SQL Server 2005.
  • Εκχωρείτε συνδέσεις σε ρόλους.
Για να μεταφέρετε συνδέσεις και κωδικούς πρόσβασης μεταξύ διαφορετικών εκδόσεων του SQL Server και, στη συνέχεια, να εκχωρήσετε συνδέσεις σε ρόλους, ακολουθήστε τα εξής βήματα:
  1. Εκτελέστε την ακόλουθη δέσμη ενεργειών στην προέλευση του SQL Server.
    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(256) OUTPUT 
    AS 
    DECLARE @charvalue varchar(256) 
    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_2000_to_2005') IS NOT NULL 
    DROP PROCEDURE sp_help_revlogin_2000_to_2005 
    GO 
    CREATE PROCEDURE sp_help_revlogin_2000_to_2005 
    
    @login_name sysname = NULL, 
    @include_db bit = 0, 
    @include_role bit = 0 
    
    AS 
    DECLARE @name sysname 
    DECLARE @xstatus int 
    DECLARE @binpwd varbinary (256) 
    DECLARE @dfltdb varchar (256) 
    DECLARE @txtpwd sysname 
    DECLARE @tmpstr varchar (256) 
    DECLARE @SID_varbinary varbinary(85) 
    DECLARE @SID_string varchar(256) 
    
    IF (@login_name IS NULL) 
    DECLARE login_curs CURSOR STATIC FOR 
    SELECT sid, [name], xstatus, password, isnull(db_name(dbid), 'master') 
    FROM master.dbo.sysxlogins 
    WHERE srvid IS NULL AND 
    [name] <> 'sa' 
    ELSE 
    DECLARE login_curs CURSOR FOR 
    SELECT sid, [name], xstatus, password, isnull(db_name(dbid), 'master') 
    FROM master.dbo.sysxlogins 
    WHERE srvid IS NULL AND 
    [name] = @login_name 
    
    OPEN login_curs 
    
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb 
    
    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 '' 
    PRINT '' 
    PRINT '' 
    PRINT '/***** CREATE LOGINS *****/' 
    
    WHILE @@fetch_status = 0 
    BEGIN 
    PRINT '' 
    SET @tmpstr = '-- Login: ' + @name 
    PRINT @tmpstr 
    
    IF (@xstatus & 4) = 4 
    BEGIN -- NT authenticated account/group 
    IF (@xstatus & 1) = 1 
    BEGIN -- NT login is denied access 
    SET @tmpstr = '' --'EXEC master..sp_denylogin ''' + @name + '''' 
    PRINT @tmpstr 
    END 
    ELSE 
    BEGIN -- NT login has access 
    SET @tmpstr = 'IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE [name] = ''' + @name + ''')' 
    PRINT @tmpstr 
    SET @tmpstr = CHAR(9) + 'CREATE LOGIN [' + @name + '] FROM WINDOWS' 
    PRINT @tmpstr 
    END 
    END 
    ELSE 
    BEGIN -- SQL Server authentication 
    EXEC sp_hexadecimal @SID_varbinary, @SID_string OUT 
    
    IF (@binpwd IS NOT NULL) 
    BEGIN -- Non-null password 
    EXEC sp_hexadecimal @binpwd, @txtpwd OUT 
    SET @tmpstr = 'CREATE LOGIN [' + @name + '] WITH PASSWORD=' + @txtpwd + ' HASHED' 
    END 
    ELSE 
    BEGIN -- Null password 
    SET @tmpstr = 'CREATE LOGIN [' + @name + '] WITH PASSWORD=''''' 
    END 
    
    SET @tmpstr = @tmpstr + ', CHECK_POLICY=OFF, SID=' + @SID_string 
    PRINT @tmpstr 
    END 
    
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb 
    END 
    
    IF @include_db = 1 
    BEGIN 
    PRINT '' 
    PRINT '' 
    PRINT '' 
    PRINT '/***** SET DEFAULT DATABASES *****/' 
    
    FETCH FIRST FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb 
    
    WHILE @@fetch_status = 0 
    BEGIN 
    PRINT '' 
    SET @tmpstr = '-- Login: ' + @name 
    PRINT @tmpstr 
    
    SET @tmpstr = 'ALTER LOGIN [' + @name + '] WITH DEFAULT_DATABASE=[' + @dfltdb + ']' 
    PRINT @tmpstr 
    
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb 
    END 
    END 
    
    IF @include_role = 1 
    BEGIN 
    PRINT '' 
    PRINT '' 
    PRINT '' 
    PRINT '/***** SET SERVER ROLES *****/' 
    
    FETCH FIRST FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb 
    
    WHILE @@fetch_status = 0 
    BEGIN 
    PRINT '' 
    SET @tmpstr = '-- Login: ' + @name 
    PRINT @tmpstr 
    
    IF @xstatus &16 = 16 -- sysadmin 
    BEGIN 
    SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''sysadmin''' 
    PRINT @tmpstr 
    END 
    
    IF @xstatus &32 = 32 -- securityadmin 
    BEGIN 
    SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''securityadmin''' 
    PRINT @tmpstr 
    END 
    
    IF @xstatus &64 = 64 -- serveradmin 
    BEGIN 
    SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''serveradmin''' 
    PRINT @tmpstr 
    END 
    
    IF @xstatus &128 = 128 -- setupadmin 
    BEGIN 
    SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''setupadmin''' 
    PRINT @tmpstr 
    END 
    
    IF @xstatus &256 = 256 --processadmin 
    BEGIN 
    SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''processadmin''' 
    PRINT @tmpstr 
    END 
    
    IF @xstatus &512 = 512 -- diskadmin 
    BEGIN 
    SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''diskadmin''' 
    PRINT @tmpstr 
    END 
    
    IF @xstatus &1024 = 1024 -- dbcreator 
    BEGIN 
    SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''dbcreator''' 
    PRINT @tmpstr 
    END 
    
    IF @xstatus &4096 = 4096 -- bulkadmin 
    BEGIN 
    SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''bulkadmin''' 
    PRINT @tmpstr 
    END 
    
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb 
    END 
    END 
    
    CLOSE login_curs 
    DEALLOCATE login_curs 
    RETURN 0 
    GO
    
    exec sp_help_revlogin_2000_to_2005 @login_name=NULL, @include_db=1, @include_role=1
    GO
  2. Αποθηκεύστε το αποτέλεσμα και, στη συνέχεια, επικολλήστε και εκτελέστε το αποτέλεσμα στο SQL Server Management Studio του SQL Server 2005 προορισμού.
Σημείωση Στην περίπτωση που ο SQL Server προέλευσης περιέχει μια σύνδεση που έχει κενό κωδικό πρόσβασης, το αποτέλεσμα περιέχει μια δήλωση που μοιάζει με την ακόλουθη.
CREATE LOGIN LoginName WITH PASSWORD = '', CHECK_POLICY = OFF, SID = MySID

Παρατηρήσεις

  • Μελετήστε προσεκτικά τη δέσμη ενεργειών που προκύπτει προτού την εκτελέσετε στο διακομιστή SQL Server προορισμού. Εάν χρειάζεται να μεταφέρετε συνδέσεις σε μια εμφάνιση του SQL Server διαφορετικού τομέα από αυτού της εμφάνισης προέλευσης του SQL Server, τροποποιήστε τη δέσμη ενεργειών που δημιουργήθηκε από τη διαδικασία sp_help_revlogin και αντικαταστήστε το όνομα τομέα με το νέο όνομα στις δηλώσεις sp_grantlogin. Επειδή οι ενσωματωμένες συνδέσεις στις οποίες έχει εκχωρηθεί πρόσβαση στο νέο τομέα, δεν θα έχουν το ίδιο SID με τις συνδέσεις του πρωτότυπου τομέα, οι χρήστες της βάσης δεδομένων δεν θα διαθέτουν αυτές τις συνδέσεις. Για να επιλύσετε το πρόβλημα με τους χρήστες που δεν διαθέτουν τις συνδέσεις, ανατρέξτε στα άρθρα που αναφέρονται στο ακόλουθο στοιχείο με κουκκίδες. Εάν μεταφέρετε ενσωματωμένες συνδέσεις μεταξύ εμφανίσεων του SQL Servers στον ίδιο τομέα, χρησιμοποιείται το ίδιο SID και ο χρήστης είναι απίθανο να μην διαθέτει τις συνδέσεις.
  • Μετά τη μετακίνηση των συνδέσεων, οι χρήστες ενδέχεται να μην έχουν δικαιώματα πρόσβασης σε βάσεις δεδομένων οι οποίες έχουν επίσης μετακινηθεί. Αυτό το πρόβλημα περιγράφεται ως "ορφανοί χρήστες". Εάν επιχειρήσετε να εκχωρήσετε δικαιώματα πρόσβασης σε σύνδεση στη βάση δεδομένων, ενδέχεται να αποτύχει η υπόδειξη του χρήστη που υπάρχει ήδη:
    Microsoft SQL-DMO (ODBC SQLState: 42000) Error 15023: User or role '%s' already exists in the current database.
    Για οδηγίες σχετικά με την αντιστοίχηση των συνδέσεων με χρήστες της βάσης δεδομένων για την επίλυση ορφανών συνδέσεων SQL Server και ενσωματωμένων συνδέσεων, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
    240872 Τρόπος επίλυσης ζητημάτων δικαιωμάτων κατά τη μετακίνηση μιας βάσης δεδομένων μεταξύ διακομιστών που χρησιμοποιούν SQL Server
    Για οδηγίες σχετικά με τη χρήση της αποθηκευμένης διαδικασίας sp_change_users_login για τη διόρθωση των ορφανών χρηστών έναν προς έναν (αυτό θα βοηθήσει μόνο τους χρήστες που είναι ορφανοί από τυπικές συνδέσεις SQL), ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
    274188 Το θέμα "Αντιμετώπιση προβλημάτων με ορφανούς χρήστες" στα ηλεκτρονικά βιβλία (Books Online) είναι ελλιπές
  • Εάν οι μεταφορά συνδέσεων και κωδικών πρόσβασης αποτελεί μέρος μιας μετακίνησης βάσεων δεδομένων σε ένα νέο διακομιστή που χρησιμοποιεί SQL Server, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base) για μια περιγραφή της ροής εργασίας και των βημάτων που περιλαμβάνονται:
    314546 Τρόπος μετακίνησης βάσεων δεδομένων μεταξύ υπολογιστών που χρησιμοποιούν SQL Server
  • Αυτό μπορείτε να το κάνετε μέσω της παραμέτρου @encryptopt της αποθηκευμένης διαδικασίας συστήματος sp_addlogin, η οποία επιτρέπει τη δημιουργία μιας σύνδεσης, χρησιμοποιώντας τον κρυπτογραφημένο κωδικό πρόσβασης. Για περισσότερες πληροφορίες σχετικά με αυτήν τη διαδικασία, ανατρέξτε στο θέμα "sp_addlogin (T-SQL)" στο SQL Server Books Online.
  • Από προεπιλογή, μόνο τα μέλη του ρόλου διακομιστή sysadminfixed έχουν το δικαίωμα επιλογής από τον πίνακα sysxlogins . Αν δεν παραχωρηθούν τα απαραίτητα δικαιώματα από ένα μέλος του ρόλου sysadmin, οι τελικοί χρήστες δεν μπορούν να δημιουργήσουν ή να εκτελέσουν αποθηκευμένες διαδικασίες.
  • Αυτή η προσέγγιση δεν επιχειρεί να μεταφέρει τις πληροφορίες της προεπιλεγμένης βάσης δεδομένων για μια συγκεκριμένη σύνδεση, επειδή η προεπιλεγμένη βάση δεδομένων ενδέχεται να μην υπάρχει στο διακομιστή προορισμού. Για να καθορίσετε την προεπιλεγμένη βάση δεδομένων για μια σύνδεση, μπορείτε να χρησιμοποιήσετε την αποθηκευμένη διαδικασία συστήματος sp_defaultdb, μεταφέροντας σε αυτήν το όνομα σύνδεσης και την προεπιλεγμένη βάση δεδομένων ως ορίσματα. Για περισσότερες πληροφορίες σχετικά με τη χρήση αυτής της διαδικασίας, ανατρέξτε στο θέμα "sp_defaultdb" στο SQL Server Books Online.
  • Στη διάρκεια της μεταφοράς συνδέσεων μεταξύ εμφανίσεων του SQL Server, εάν η σειρά ταξινόμησης του διακομιστή προέλευσης και του διακομιστή προορισμού κάνουν διάκριση πεζών-κεφαλαίων, πρέπει να καταχωρήσετε όλους τους αλφαβητικούς χαρακτήρες των κωδικών πρόσβασης με κεφαλαία γράμματα, μετά από τη μεταφορά των συνδέσεων στο διακομιστή προορισμού. Εάν η σειρά ταξινόμησης του διακομιστή προέλευσης κάνει διάκριση πεζών-κεφαλαίων και η σειρά ταξινόμησης του διακομιστή προορισμού δεν κάνει διάκριση πεζών-κεφαλαίων, δεν θα έχετε τη δυνατότητα να συνδεθείτε με τις συνδέσεις που μεταφέρθηκαν χρησιμοποιώντας τη διαδικασία που περιγράφεται σε αυτό το άρθρο, εκτός αν ο αρχικός κωδικός πρόσβασης περιέχει μη αλφαβητικούς χαρακτήρες ή αν όλοι οι αλφαβητικοί χαρακτήρες του αρχικού κωδικού πρόσβασης είναι με κεφαλαία γράμματα. Στην περίπτωση που και οι δύο διακομιστές κάνουν διάκριση πεζών-κεφαλαίων ή δεν κάνουν διάκριση πεζών-κεφαλαίων, δεν θα αντιμετωπίσετε αυτό το πρόβλημα. Αυτή είναι μια παρενέργεια του τρόπου χειρισμού κωδικών πρόσβασης από τον SQL Server. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα "Επίδραση της αλλαγής σειράς ταξινόμησης σε κωδικούς πρόσβασης" στο SQL Server 7.0 Books Online.
  • Όταν εκτελείτε το αποτέλεσμα της δέσμης ενεργειών sp_help_revlogin στο διακομιστή προορισμού, εάν ο διακομιστής προορισμού διαθέτει ήδη μια σύνδεση που έχει καθοριστεί με το ίδιο όνομα που έχει μία από τις συνδέσεις του αποτελέσματος της δέσμης ενεργειών, ενδέχεται να δείτε το ακόλουθο σφάλμα κατά την εκτέλεση του αποτελέσματος της δέσμης ενεργειών sp_help_revlogin:
    Server: Msg 15025, Level 16, State 1, Procedure sp_addlogin, Line 56
    The login 'test1' already exists.
    Ομοίως, εάν σε αυτόν το διακομιστή υπάρχει μια διαφορετική σύνδεση με την ίδια τιμή SID με αυτήν που προσπαθείτε να προσθέσετε, εμφανίζεται το ακόλουθο μήνυμα λάθους:
    Server: Msg 15433, Level 16, State 1, Procedure sp_addlogin, Line 93
    Supplied parameter @sid is in use.
    Κατά συνέπεια, πρέπει να μελετήσετε προσεκτικά το αποτέλεσμα αυτών των εντολών, να εξετάσετε τα περιεχόμενα του πίνακα sysxlogins και να αντιμετωπίσετε ανάλογα αυτά τα σφάλματα.
  • Η τιμή SID μιας συγκεκριμένης σύνδεσης χρησιμοποιείται ως βάση για την υλοποίησης πρόσβασης επιπέδου βάσης δεδομένων στον SQL Server. Επομένως, εάν η ίδια σύνδεση έχει δύο διαφορετικές τιμές για το SID στο επίπεδο βάσης δεδομένων (σε δύο διαφορετικές βάσεις δεδομένων αυτού του διακομιστή), η σύνδεση θα έχει δικαίωμα πρόσβασης μόνο σε αυτήν τη βάση δεδομένων της οποίας το SID ταιριάζει με την τιμή του syslogins για αυτήν τη σύνδεση. Μια τέτοια κατάσταση μπορεί να προκύψει όταν οι εν λόγω δύο βάσεις δεδομένων έχουν ενοποιηθεί από δύο διαφορετικούς διακομιστές. Για να επιλύσετε αυτό το πρόβλημα, η εν λόγω σύνδεση πρέπει να καταργηθεί με μη αυτόματο τρόπο από τη βάση δεδομένων, στην οποία εμφανίζεται ασυμφωνία SID, χρησιμοποιώντας την αποθηκευμένη διαδικασία sp_dropuser και, στη συνέχεια, να προστεθεί ξανά χρησιμοποιώντας την αποθηκευμένη διαδικασία sp_adduser.

Ιδιότητες

Αναγν. άρθρου: 246133 - Τελευταία αναθεώρηση: Τρίτη, 26 Φεβρουαρίου 2008 - Αναθεώρηση: 8.2
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000, Workgroup Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
Λέξεις-κλειδιά: 
kbhowtomaster kbinfo KB246133

Αποστολή σχολίων

 

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