分享
 
 
 

HOW TO:在 SQL Server 实例之间传输登录和密码

王朝mssql·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

概要

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

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

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_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,而且用户不太可能被孤立。

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

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 存储过程添加它。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有