当前位置:数据库 > SQLServer >>

怎样在 SQL Server 实例之间传输登录和密码

来自:http://blog.csdn.net/ITmuse/

概要
在将数据库移动到新服务器后,用户可能无法登录到新服务器。相反,他们会收到下面的错误信息:

Msg 18456, Level 16, State 1
Login failed for user %ls.


您必须将登录和密码传输到新服务器。本文介绍如何向新服务器传输登录和密码。


如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
SQL Server 7.0 数据转换服务 (DTS) 对象传输功能可在两台服务器之间传输登录和用户,但它不传输 SQL Server 验证登录的密码。要从一台运行 SQL Server 7.0 的服务器向另一台运行 SQL Server 7.0 的服务器传输登录和密码,请按照本文"在 Master 数据库中创建和运行存储过程"一节中的说明操作。您将在源服务器上创建 sp_help_revlogin 存储过程。此过程将生成一个脚本,您可以在目标服务器上运行该脚本,以重新创建带有原始安全标识号 (SID) 的登录,并保留当前的密码。


如何从 SQL Server 7.0 向 SQL Server 2000 或者在正运行 SQL Server 2000 的服务器之间传输登录和密码
要从 SQL Server 7.0 服务器向 SQL Server 2000 的一个实例或者在 SQL Server 2000 的两个实例之间传输登录和密码,可以使用 SQL Server 2000 中新的 DTS Package Transfer Logins Task(DTS 包传输登录任务)。要使用此任务,请执行以下步骤:


在 Master 数据库中创建和运行存储过程
请查看本文末尾的备注,以了解有关下列步骤的重要信息。
1. 在源 SQL Server 上运行以下脚本。此脚本可在 master 数据库中创建名称分别为 sp_hexadecimal 和 sp_help_revlogin 的两个存储过程。请在创建完过程之后继续执行第 2 步。

注意:下面的过程取决于 SQL Server 系统表。这些表的结构在 SQL Server 的不同版本之间可能会有变化,请不要直接从系统表中选择。

----- 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 过程。sp_help_revlogin 存储过程可同时用于 SQL Server 7.0 和 SQL Server 2000。sp_help_revlogin 存储过程的输出是登录脚本,该脚本可创建带有原始 SID 和密码的登录。保存输出,然后将其粘贴到目标 SQL Server 上的查询分析器中,并运行它。例如:
EXEC master..sp_help_revlogin

 

备注
• 在目标 SQL Server 上运行输出脚本之前,请认真查看此脚本。如果必须将登录传输到与 SQL Server 源实例不在同一个域中的 SQL Server 实例,请编辑由 sp_help_revlogin 过程生成的脚本,并在 sp_grantlogin 语句中将域名替换为新的域名。由于在新域中被授予访问权的集成登录与原域中的登录具有不同的 SID,因此数据库用户将被从这些登录中孤立出去。要解决这些孤立用户,请参见以下项目符号项中引用的文章。如果在同一个域中的 SQL Server 实例之间传输集成登录,则会使用相同的 SID,而且用户不太可能被孤立。
• 在移动登录之后,

补充:综合编程 , 安全编程 ,
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,