如何在正运行 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 包传输登录任务)。要使用此任务,请执行以下步骤:

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 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,而且用户不太可能被孤立。
在移动登录之后,用户将不再具有访问已被同时移动的数据库的权限。此问题称为“孤立用户”。如果尝试将访问此数据库的权限授予该登录,则可能会失败,这表明该用户已存在:

Microsoft SQL-DMO (ODBC SQLState:42000) Error 15023:User or role '%s' already exists in the current database.
有关如何将登录映射到数据库用户以解决孤立的 SQL Server 登录和集成登录的说明,请参见以下 Microsoft 知识库文章:
240872 HOW TO:在 SQL 服务器之间移动数据库时如何解决权限问题

有关使用 sp_change_users_login 存储过程逐个解决孤立用户(仅能解决从标准 SQL 登录中孤立出去的用户)的说明,请参见以下 Microsoft 知识库文章:
274188 PRB: "Troubleshooting Orphaned Users" Topic in Books Online is Incomplete
如果传输登录和密码是向运行 SQL Server 的新服务器移动数据库的一部分,请参见以下 Microsoft 知识库文章,以了解对所涉及的工作流程和步骤的说明:
314546 HOW TO: Move Databases Between Computers That Are Running SQL Server
能够这样做的原因在于:sp_addlogin 系统存储过程中的 @encryptopt 参数允许通过使用加密密码来创建登录。有关此过程的更多信息,请参见 SQL Server 联机图书中的“sp_addlogin (T-SQL)”主题。
默认情况下,只有 sysadminfixed 服务器角色的成员可以从 sysxlogins 表中进行选择。除非 sysadmin 角色的成员授予了必要的权限,否则最终用户将无法创建或运行这些存储过程。
此方法不会尝试传输特定登录的默认数据库信息,因为默认数据库并不始终存在于目标服务器中。要为某个登录定义默认数据库,您可以使用 sp_defaultdb 系统存储过程,并将登录名和默认数据库作为参数传递给该过程。有关使用此过程的更多信息,请参见 SQL Server 联机图书中的“sp_defaultdb”主题。
在 SQL Server 实例之间传输登录的过程中,如果源服务器的排序顺序不区分大小写,而目标服务器的排序顺序区分大小写,则在将登录传输到目标服务器后,必须在密码中用大写形式输入所有字母字符。如果源服务器的排序顺序区分大小写,而目标服务器的排序顺序不区分大小写,则无法通过使用本文概述的过程传输的登录进行登录,除非原始密码不包含字母字符,或者原始密码中的所有字母字符都是大写字符。如果两个服务器都区分大小写或者都不区分大小写,则不会出现此问题。这是 SQL Server 处理密码的方式所带来的副作用。有关更多信息,请参见 SQL Server 7.0 联机图书中的“Effect on Passwords of Changing Sort Orders”(更改排序顺序对密码的影响)主题。
当在服务器上运行 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 中的值相匹配的数据库。如果所讨论的两个数据库已从两个不同的服务器合并在一起,则可能出现这种情形。要解决此问题,需要使用 sp_dropuser 存储过程从具有不匹配 SID 的数据库中手动删除所讨论的登录,然后再使用 sp_adduser 存储过程添加它。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分 概觀篇 1. 微軟SQL Server的發展歷史:1989到1999 [加入我的離線書架] . Ron的故事 . Kalen的故事 . Microsoft SQL Server發行 . 發展過程中的角色 . OS/2和合作伙伴間的戰火(Friendly Fire) . 4.2版 . SQL Server For Windows NT . 成功所帶來的改變 . 合作開發的結束 . SQL95的任務 . 下一個版本 . Sphinx的秘密 . 新的未來 2. SQL Server導覽 [加入我的離線書架] . SQL Server引擎 . DBMS強制的資料完整(Data Integrity) . 交易(Transaction)處理 . 對稱(Symmetric)伺服器架構 . 安全(Security) . 高可用性(Availability) . 分散式資料處理 . 資料複製(Replication) . 系統管理 . SQL Server公用程式(Utility)與延伸部分(Extension) . 用戶端開發介面 . 總結 第二部分 架構概觀篇 3. SQL Server架構 [加入我的離線書架] . SQL Server引擎 . 記憶體管理 . 交易日誌記錄(Transaction Logging)與回復(Recovery) . SQL Server核心(Kernel)以及與作業系統的互動(Interaction) . 總結 第三部分 使用Microsoft的SQL Server 4. 規劃及安裝SQL Server [加入我的離線書架] . SQL Server的版本 . 硬體指引 . 硬體元件 . 作業系統 . 檔案系統 . 安全性與使用者身份(Context) . 授 權 . 網路協定 . 字元集與排序順序 . 安裝SQL Server . 安裝後的基本組態 . 遠端與不在場安裝 . 總結 5. 資料庫與資料庫檔案 [加入我的離線書架] . 特殊系統資料庫 . 資料庫檔案 . 建立資料庫 . 擴增(Expand)與縮減(Shrink)資料庫 . 修改交易日誌(log)檔案大小 . 資料庫檔案群組(Filegroups) . 修改資料庫 . 資料庫的內部 . 資料庫選項 . 其他資料庫考量 . 總結 6. 表格(Table) [加入我的離線書架] . 建立表格 . 內部儲存體-細節 . 索 引 . 使用者自訂型態 . Identity屬性 . 限制(Constraints) . 修改表格 . 暫存表格 . 總結 7. 查詢資料 [加入我的離線書架] . 查詢(SELECT)敘述 . NULL的處理 . 子查詢(Subquery) . 檢視表和導出表格(Views and Derived Tables) . 其它的搜尋運算子 . 總結 8. 修改資料 [加入我的離線書架] . 基本的修改動作 . 內部資料修改 . 總結 9. Transact-SQL程式設計 [加入我的離線書架] . 將Transact-SQL當作程式語言 . Transact-SQL程式設計構詞兒─基礎 . 總結 10. 批次、交易、預儲程序與觸發 [加入我的離線書架] . 批次(Batch) . 交易(Transaction) . 預儲程序 . 執行批次或預儲程序預儲什麼? . 觸發(Trigger) . 預儲程序與觸發的除錯(Debugging) . 使用Text與Image資料 . 環境的考量 . 總 結 11. 游標(Cursor) [加入我的離線書架] . 游標基本概述 . 游標與ISAM . 游標模式 . 適當的使用游標 . 使用Transact-SQL游標 . 游標變數 . 總結 12. Transact-SQL範例與難題 [加入我的離線書架] . 使用觸發器(Trigger)來實作參考動作(Referential Actions) . 難題(Brainteaser) . 總結 13. 鎖 定 [加入我的離線書架] . 鎖定管理員(Lock Manager) . 使用者資料的鎖定型別 . 鎖定相容性 . 結合連線(Bound Connection) . 列階層與分頁階層鎖定 . 鎖定提示(Hints)與追蹤旗標(Trace Flags) . 總結 第四部分 效能與調整篇 14. 查詢效能最佳化 [加入我的離線書架] . 開發小組 . 應用程式與資料庫設計 . 規劃尖峰使用量 . 了解互動系統的回應時間 . 建立原型(Prototyping)、標準效能評估 (Benchmarking) 與測試 (Testing) . 建立有用的索引 . 使用預儲程序(stored procedure)與快取機制 . 同時性(concurrency)與 一致性 (consistent) 互抵 (trade-off) . 解決阻擋(Blocking)問題 . 解決死結問題 . 分離OLTP與DSS應用程式 . 查詢最佳化 . 監控查詢效能 . 總結 15. 設定與效能監看 [加入我的離線書架] . Windows NT組態設定 . SQL Server組態設定 . 系統維護 . 監看系統行為 . 總結 建議閱讀書目 [加入我的離線書架]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值