Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Cách chuyển thông tin đăng nhập và mật khẩu giữa các phiên bản của SQL Server 2005 và SQL Server 2008

GIỚI THIỆU
Bài viết này mô tả cách chuyển thông tin đăng nhập và mật khẩu giữa các phiên bản của SQL Server 2005 và Microsoft SQL Server 2008 trên các máy chủ khác nhau.

Để biết thêm thông tin về cách chuyển thông tin đăng nhập và mật khẩu giữa các phiên bản khác của SQL Server, bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:
246133 Cách chuyển thông tin đăng nhập và mật khẩu giữa các phiên bản của SQL Server
THÔNG TIN THÊM
Trong bài viết này, máy chủ A và máy chủ B là các máy chủ khác nhau. Ngoài ra, cả máy chủ A và máy chủ B đang chạy SQL Server 2005.

Chú ý Thông tin này cũng áp dụng cho SQL Server 2008.

Sau khi bạn di chuyển cơ sở dữ liệu từ phiên bản SQL Server trên máy chủ A sang phiên bản SQL Server trên máy chủ B, người dùng có thể không đăng nhập được vào cơ sở dữ liệu trên máy chủ B. Ngoài ra, người dùng có thể nhận được thông báo lỗi sau:
Đăng nhập không thành công cho người dùng 'MyUser'. (Microsoft SQL Server, Lỗi: 18456)
Sự cố này xảy ra do bạn không chuyển thông tin đăng nhập và mật khẩu từ phiên bản SQL Server trên máy chủ A sang phiên bản SQL Server trên máy chủ B.

Để chuyển thông tin đăng nhập và mật khẩu từ phiên bản SQL Server trên máy chủ A sang phiên bản SQL Server trên máy chủ B, hãy làm theo các bước sau:
  1. Trên máy chủ A, khởi động SQL Server Management Studio, sau đó kết nối với phiên bản SQL Server mà từ đó bạn di chuyển cơ sở dữ liệu.
  2. Mở cửa sổ Query Editor mới, sau đó chạy tập lệnh sau.
    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)BẮT ĐẦU  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)BẮT ĐẦU  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)BẮT ĐẦU  IF (@@fetch_status <> -2)  BẮT ĐẦU    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 )        BẮT ĐẦU          SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked        END        IF ( @is_expiration_checked IS NOT NULL )        BẮT ĐẦU          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
    Chú ý Tập lệnh này tạo hai quy trình được lưu trữ trong cơ sở dữ liệu chính. Hai quy trình được lưu trữ được đặt tên là quy trình được lưu trữ sp_hexadecimal và quy trình được lưu trữ sp_help_revlogin.
  3. Chạy câu lệnh sau.
    EXEC sp_help_revlogin
    Tập lệnh xuất được tạo bởi quy trình được lưu trữ sp_help_revlogin là tập lệnh đăng nhập. Tập lệnh đăng nhập này tạo thông tin đăng nhập có Mã định dạng Bảo mật (SID) gốc và mật khẩu gốc.
  4. Trên máy chủ B, khởi động SQL Server Management Studio, sau đó kết nối với phiên bản SQL Server mà từ đó bạn di chuyển cơ sở dữ liệu.

    Quan trọng Trước khi bạn chuyển đến bước 5, hãy xem lại thông tin trong phần "Ghi chú".
  5. Mở cửa sổ Query Editor mới, sau đó chạy tệp lệnh xuất được tạo trong bước 3.

Ghi chú

Xem lại thông tin sau trước khi bạn chạy tập lệnh xuất trong phiên bản trên máy chủ B:
  • Xem lại kỹ lưỡng tập lệnh xuất. Nếu máy chủ A và máy chủ B ở các miền khác nhau, bạn phải sửa đổi tập lệnh xuất. Sau đó, bạn phải thay thế tên miền gốc bằng tên miền mới trong các câu lệnh CREATE LOGIN. Thông tin đăng nhập tích hợp được cấp quyền truy nhập trong miền mới không có cùng SID như thông tin đăng nhập trong miền gốc. Do đó, người dùng bị tách biệt với thông tin đăng nhập này. Để biết thêm thông tin về cách giải quyết những người dùng mồ côi này, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:
    240872 Cách giải quyết các vấn đề về quyền khi bạn di chuyển cơ sở dữ liệu giữa các máy chủ đang chạy SQL Server
    Nếu máy chủ A và máy chủ B ở trong cùng một miền, SID giống nhau được sử dụng. Do đó, người dùng không thể bị mồ côi.
  • Trong tập lệnh xuất, thông tin đăng nhập được tạo bằng mật khẩu được mã hoá. Điều này là do đối số BĂM trong câu lệnh CREATE LOGIN. Đối số này chỉ định rằng mật khẩu được nhập sau đối số MẬT KHẨU đã bị băm.
  • Theo mặc định, chỉ thành viên của vai trò máy chủ cố định sysadmin có thể chạy câu lệnh SELECT từ chế độ xem sys.server_principals. Trừ khi thành viên của vai trò máy chủ cố định sysadmin cấp các quyền cần thiết cho người dùng, người dùng không thể tạo hoặc chạy tập lệnh xuất.
  • Các bước trong bài viết này không chuyển thông tin cơ sở dữ liệu mặc định cho một lần đăng nhập cụ thể. Đó là do cơ sở dữ liệu mặc định có thể luôn tồn tại trên máy chủ B. Để xác định cơ sở dữ liệu mặc định cho một lần đăng nhập, sử dụng câu lệnh ALTER LOGIN bằng cách chuyển vào tên đăng nhập và cơ sở dữ liệu mặc định dưới dạng đối số.
  • Thứ tự sắp xếp của máy chủ A có thể không phân biệt chữ hoa chữ thường và thứ tự sắp xếp của máy chủ B có thể phân biệt chữ hoa chữ thường. Trong trường hợp này, người dùng phải nhập tất cả các chữ cái trong mật khẩu dưới dạng chữ cái hoa sau khi bạn chuyển thông tin đăng nhập và mật khẩu vào phiên bản trên máy chủ B.

    Hoặc thứ tự sắp xếp của máy chủ A có thể phân biệt chữ hoa chữ thường và thứ tự sắp xếp của máy chủ B có thể không phân biệt chữ hoa chữ thường. Trong trường hợp này, người dùng không thể đăng nhập bằng thông tin đăng nhập và mật khẩu mà bạn chuyển vào phiên bản trên máy chủ B trừ khi một trong các điều kiện sau đây đúng:
    • Mật khẩu gốc không chứa các chữ cái.
    • Tất cả các chữ cái trong mật khẩu gốc là chữ cái hoa.
    Thứ tự sắp xếp của cả máy chủ A và máy chủ B có thể phân biệt chữ hoa chữ thường hoặc thứ tự sắp xếp của cả máy chủ A và máy chủ B có thể không phân biệt chữ hoa chữ thường. Trong các trường hợp này, người dùng không gặp sự cố.
  • Thông tin đăng nhập đã ở trong phiên bản trên máy chủ B có thể có tên giống với tên trong tập lệnh xuất. Trong trường hợp này, bạn nhận được thông báo lỗi sau khi chạy tệp lệnh xuất trong phiên bản trên máy chủ B:
    Thông báo lỗi 15025, Mức 16, Trạng thái 1, Dòng 1
    Người uỷ nhiệm máy chủ 'MyLogin' đã tồn tại.
    Tương tự, thông tin đăng nhập đã ở trong phiên bản trên máy chủ B có thể có SID giống với SID trong tập lệnh xuất. Trong trường hợp này, bạn nhận được thông báo lỗi sau khi chạy tệp lệnh xuất trong phiên bản trên máy chủ B:
    Thông báo lỗi 15433, Mức 16, Trạng thái 1, Dòng 1
    Sid tham số được cung cấp đang được sử dụng.
    Do đó, bạn phải thực hiện những việc sau:
    1. Xem lại kỹ lưỡng tập lệnh xuất.
    2. Kiểm tra nội dung của chế độ xem sys.server_principals trong phiên bản trên máy chủ B.
    3. Giải quyết các thông báo lỗi này tương ứng.
  • Trong SQL Server 2005, SID cho một lần đăng nhập được sử dụng làm cơ sở để triển khai truy nhập cấp cơ sở dữ liệu. Thông tin đăng nhập có thể có hai SID khác nhau trong hai cơ sở dữ liệu khác nhau trên máy chủ. Trong trường hợp này, thông tin đăng nhập chỉ có thể truy nhập cơ sở dữ liệu có SID khớp với SID trong chế độ xem sys.server_principals. Sự cố này chỉ có thể xảy ra nếu hai cơ sở dữ liệu được hợp nhất từ hai máy chủ khác nhau. Để giải quyết sự cố này, xoá thông tin đăng nhập khỏi cơ sở dữ liệu có SID không trùng khớp theo cách thủ công bằng cách sử dụng câu lệnh DROP USER. Sau đó, thêm lại thông tin đăng nhập bằng cách sử dụng câu lệnh CREATE USER.
THAM KHẢO
Để biết thêm thông tin về cách khắc phục sự cố người dùng mồ côi, hãy ghé thăm Web site Mạng lưới Nhà phát triển Microsoft (MSDN): Để biết thêm thông tin về câu lệnh CREATE LOGIN, hãy ghé thăm Web site sau của MSDN: Để biết thêm thông tin về câu lệnh ALTER LOGIN, hãy ghé thăm Web site sau của MSDN:
Thuộc tính

ID Bài viết: 918992 - Xem lại Lần cuối: 09/17/2011 22:34:00 - Bản sửa đổi: 2.0

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition

  • kbsqlsetup kbexpertiseadvanced kbhowto kbinfo KB918992
Phản hồi