如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码

发表于:2007-06-07来源:作者:点击数: 标签:
SQL Server 7.0 数据转换服务 (DTS) 对象传输功能可在两台 服务器 之间传输登录和用户,但它不传输 SQL Server 验证登录的密码。要从一台运行 SQL Server 7.0 的服务器向另一台运行 SQL Server 7.0 的服务器传输登录和密码,请按照本文在 Master 数据库中创建
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 包传输登录任务)。要使用此任务,请执行以下步骤:

1. 连接到 SQL Server 2000 目标服务器,移动到 SQL Server 企业管理器中的数据转换服务,展开此文件夹,右键单击本地程序包,然后单击新增程序包
2. 在 DTS 程序包设计器打开后,单击任务菜单上的传输登录任务。根据需要完成有关目标登录选项卡的信息。

重要说明:SQL Server 2000 目标服务器不能运行 64 位版本的 SQL Server 2000。64 位版本 SQL Server 2000 的 DTS 组件不可用。如果要从其他计算机上的 SQL Server 实例中导入登录,您的 SQL Server 实例必须在域帐户下运行才能完成此任务。

注意:您可以使用 DTS 方法或本文“在 Master 数据库中创建和运行存储过程”一节中的脚本,从 SQL Server 7.0 向 SQL Server 2000 或者在 SQL Server 2000 的实例之间传输登录。DTS 方法将传输密码,但不传输原始 SID。如果登录不是使用原始 SID 创建的,而且用户数据库也被传输到一台新服务器,则该数据库用户将被从该登录中孤立出去。要传输原始 SID 并回避孤立用户,请使用本文下一节中的脚本代替 DTS 方法。
返回页首

在 Master 数据库中创建和运行存储过程

请查看本文末尾的备注,以了解有关下列步骤的重要信息。
1. 在源 SQL Server 上运行以下脚本。此脚本可在 master 数据库中创建名称分别为 sp_hexadecimalsp_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 aclearcase/" target="_blank" >ccount/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,而且用户不太可能被孤立。
在移动登录之后,用户将不再具有访问已被同时移动的数据库的权限。此问题称为“孤立用户”。如果尝试将访问此数据库的权限授予该登录,则可能会失败,这表明该用户已存在:

Microsoft SQL-DMO (ODBC SQLState:42000) Error 15023:User or role '%s' already exists in the current database.

原文转自:http://www.ltesting.net