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

Περίληψη

Μετά από τη μετακίνηση βάσεων δεδομένων σε ένα νέο διακομιστή, οι χρήστες ενδέχεται να μην είναι σε θέση να συνδεθούν με το νέο διακομιστή. Αντίθετα, εμφανίζεται το ακόλουθο μήνυμα λάθους:
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 - Τελευταία αναθεώρηση: 11 Ιουλ 2008 - Αναθεώρηση: 1

Σχόλια