Συμβουλή συστήματοςΑυτό το άρθρο ισχύει για διαφορετικό λειτουργικό σύστημα από αυτό που χρησιμοποιείτε. Το περιεχόμενο του άρθρου που ενδέχεται να μην σας αφορά έχει απενεργοποιηθεί.
Μετά από τη μετακίνηση βάσεων δεδομένων σε ένα νέο
διακομιστή, οι χρήστες ενδέχεται να μην είναι σε θέση να συνδεθούν με το νέο
διακομιστή. Αντίθετα, εμφανίζεται το ακόλουθο μήνυμα λάθους:
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. Για να το κάνετε αυτό,
ακολουθήστε τα εξής βήματα:
Συνδεθείτε με το διακομιστή προορισμού με SQL Server 2000,
μετακινηθείτε στον Data Transformation Services in SQL Server Enterprise
Manager, αναπτύξτε το φάκελο, κάντε δεξιό κλικ στην επιλογή Πακέτα τοπικών ρυθμίσεων (Local Packages) και, στη συνέχεια, κάντε κλικ στην επιλογή Νέο πακέτο (New Package).
Μετά το άνοιγμα του σχεδιαστή πακέτων 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
(http://support.microsoft.com/kb/918992/EL/
)
Τρόπος μεταφοράς των συνδέσεων και των κωδικών πρόσβασης μεταξύ εμφανίσεων του SQL Server 2005
Πλήρης λύση για τη μεταφορά συνδέσεων και κωδικών πρόσβασης μεταξύ διαφορετικών εκδόσεων του SQL Server
Για να γίνει αυτό, χρησιμοποιήστε μία από τις ακόλουθες
μεθόδους. Σημειώσεις (Notes)
Οι δέσμες ενεργειών που περιγράφονται στις ακόλουθες
μεθόδους δημιουργούν δύο αποθηκευμένες διαδικασίες, οι οποίες ονομάζονται
αποθηκευμένη διαδικασία sp_hexadecimal και αποθηκευμένη διαδικασία sp_help_revlogin στη βάση δεδομένων master.
Οι δέσμες ενεργειών εξαρτώνται από τους πίνακες του
συστήματος SQL Server. Η δομή αυτών των πινάκων ενδέχεται να αλλάζει μεταξύ των
εκδόσεων του SQL Server. Δεν συνιστάται η επιλογή απευθείας από τους πίνακες
του συστήματος.
Εξετάστε τα σχόλια στο τέλος αυτού του άρθρου για να βρείτε
σημαντικές πληροφορίες σχετικά με τα βήματα που αναφέρονται σε αυτές τις
μεθόδους.
Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από τον SQL
Server 7.0 στον SQL Server 7.0.
Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από τον SQL
Server 7.0 στον SQL Server 2000.
Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης μεταξύ
διακομιστών που χρησιμοποιούν SQL Server 2000.
Για να μεταφέρετε συνδέσεις και κωδικούς πρόσβασης μεταξύ
διαφορετικών συνδέσεων του SQL Server, ακολουθήστε τα εξής βήματα:
Εκτελέστε την ακόλουθη δέσμη ενεργειών στην προέλευση του
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 -----
Μετά τη δημιουργία της αποθηκευμένης διαδικασίας 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
προορισμού. Για παράδειγμα:
Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από τον SQL
Server 7.0 στον SQL Server 2005.
Μεταφέρετε συνδέσεις και κωδικούς πρόσβασης από τον SQL
Server 2000 στον SQL Server 2005.
Εκχωρείτε συνδέσεις σε ρόλους.
Για να μεταφέρετε συνδέσεις και κωδικούς πρόσβασης μεταξύ
διαφορετικών εκδόσεων του SQL Server και, στη συνέχεια, να εκχωρήσετε συνδέσεις
σε ρόλους, ακολουθήστε τα εξής βήματα:
Εκτελέστε την ακόλουθη δέσμη ενεργειών στην προέλευση του
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
Αποθηκεύστε το αποτέλεσμα και, στη συνέχεια, επικολλήστε
και εκτελέστε το αποτέλεσμα στο SQL Server Management Studio του SQL Server
2005 προορισμού.
Σημείωση Στην περίπτωση που ο SQL Server προέλευσης περιέχει μια σύνδεση
που έχει κενό κωδικό πρόσβασης, το αποτέλεσμα περιέχει μια δήλωση που μοιάζει
με την ακόλουθη.
Μελετήστε προσεκτικά τη δέσμη ενεργειών που προκύπτει
προτού την εκτελέσετε στο διακομιστή 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
(http://support.microsoft.com/kb/240872/EL/
)
Τρόπος επίλυσης ζητημάτων δικαιωμάτων κατά τη μετακίνηση μιας βάσης δεδομένων μεταξύ διακομιστών που χρησιμοποιούν SQL Server
Για οδηγίες σχετικά με τη χρήση της αποθηκευμένης
διαδικασίας sp_change_users_login για τη διόρθωση των ορφανών χρηστών έναν προς έναν (αυτό θα
βοηθήσει μόνο τους χρήστες που είναι ορφανοί από τυπικές συνδέσεις SQL),
ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge
Base):
274188
(http://support.microsoft.com/kb/274188/EL/
)
Το θέμα "Αντιμετώπιση προβλημάτων με ορφανούς χρήστες" στα ηλεκτρονικά βιβλία (Books Online) είναι ελλιπές
Εάν οι μεταφορά συνδέσεων και κωδικών πρόσβασης αποτελεί
μέρος μιας μετακίνησης βάσεων δεδομένων σε ένα νέο διακομιστή που χρησιμοποιεί
SQL Server, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft
(Knowledge Base) για μια περιγραφή της ροής εργασίας και των βημάτων που
περιλαμβάνονται:
314546
(http://support.microsoft.com/kb/314546/EL/
)
Τρόπος μετακίνησης βάσεων δεδομένων μεταξύ υπολογιστών που χρησιμοποιούν 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.
Πόση προσπάθεια καταβάλλατε για να χρησιμοποιήσετε αυτό το άρθρο;
Πολύ λίγη
Λίγη
Μέτρια
Μεγάλη
Πολύ μεγάλη
Πείτε μας για ποιον λόγο και με ποιον τρόπο θα μπορούσαμε να βελτιώσουμε αυτές τις πληροφορίες
Σας ευχαριστούμε! Τα σχόλιά σας θα μας βοηθήσουν να βελτιώσουμε το περιεχόμενο υποστήριξης. Για περισσότερες επιλογές βοήθειας, επισκεφτείτε την αρχική σελίδα της Βοήθειας και υποστήριξης.