加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

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

发布时间:2018-08-15 16:47:22 所属栏目:电商 来源:站长网
导读:提纲在将数据库移动到新处事器后,用户也许无法登录到新处事器。相反,他们会收到下面的错误信息: Msg 18456, Level 16, State 1 Login failed for user '%ls'. 您必需将登录和暗码传输到新处事器。本文先容怎样向新处事器传输登录和暗码。 返回页首 怎样
提纲在将数据库移动到新处事器后,用户也许无法登录到新处事器。相反,他们会收到下面的错误信息:
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 masterGOIF OBJECT_ID ('sp_hexadecimal') IS NOT NULL DROP PROCEDURE sp_hexadecimalGOCREATE PROCEDURE sp_hexadecimal @binvalue varbinary(256), @hexvalue varchar(256) OUTPUTASDECLARE @charvalue varchar(256)DECLARE @i intDECLARE @length intDECLARE @hexstring char(16)SELECT @charvalue = '0x'SELECT @i = 1SELECT @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 + 1ENDSELECT @hexvalue = @charvalueGOIF OBJECT_ID ('sp_help_revlogin') IS NOT NULL DROP PROCEDURE sp_help_revloginGOCREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL ASDECLARE @name sysnameDECLARE @xstatus intDECLARE @binpwd varbinary (256)DECLARE @txtpwd sysnameDECLARE @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_nameOPEN login_cursFETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwdIF (@@fetch_status = -1)BEGIN 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 ''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 @tmpstrEXEC sp_hexadecimal @SID_varbinary,@SID_string OUT SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name + ''', @pwd, @sid = ' + @SID_string + ', @encryptopt = ' END ELSE BEGIN -- Null passwordEXEC 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 ENDCLOSE login_cursDEALLOCATE login_cursRETURN 0GO ----- 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 存储进程添加它。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读