新教程:在SQL Server实例之间传输登录和密码
当前位置:以往代写 > 其他教程 >新教程:在SQL Server实例之间传输登录和密码
2019-06-14

新教程:在SQL Server实例之间传输登录和密码

新教程:在SQL Server实例之间传输登录和密码

新教程:在SQL Server实例之间传输登录和密码

不知不觉又来到小编的文章,这次又带来了一点小知识与大家分享,希望大家有所收获编程语言有哪些

概要
在将数据库移动到新服务器后,用户可能无法登录到新服务器。相反,他们会收到下面的错误消息:
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 的服务器,请执行“在不同版本的 SQL Server 之间传输登录和密码的完整解决方案”一节中的步骤。
如何从 SQL Server 7.0 向 SQL Server 2000 或者在运行 SQL Server 2000 的服务器之间传输登录和密码
要从 SQL Server 7.0 服务器向 SQL Server 2000 的一个实例或者在 SQL Server 2000 的两个实例之间传输登录和密码,可以使用 SQL Server 2000 中新的 DTS 包传输登录任务。为此,请按照下列步骤操作:1. 连接到 SQL Server 2000 目标服务器,移动到 SQL Server 企业管理器中的数据转换服务,展开此文件夹,右键单击“本地包”,然后单击“新增包”。
1、在 DTS 程序包设计器打开后,单击“任务”菜单上的“传输登录任务”。根据需要完成有关“源”、“目标”和“登录”选项卡的信息。
重要说明:SQL Server 2000 目标服务器不能运行 64 位版本的 SQL Server 2000。64 位版本 SQL Server 2000 的 DTS 组件不可用。如果要从其他计算机上的 SQL Server 实例中导入登录,您的 SQL Server 实例必须在域帐户下运行才能完成此任务。
注意:DTS 方法将传输密码,但不会传输原始 SID。如果登录不是使用原始 SID 创建的,而且用户数据库也被传输到一台新服务器,则该数据库用户将从该登录中孤立出去。要传输原始 SID 并绕过被孤立的用户,请执行“在不同版本的 SQL Server 之间传输登录和密码的完整解决方案”一节中的步骤。
在不同版本的 SQL Server 之间传输登录和密码的完整解决方案
此方法适用于以下情况:
• 从 SQL Server 7.0 向 SQL Server 7.0 传输登录和密码。
• 从 SQL Server 7.0 向 SQL Server 2000 传输登录和密码。
• 从 SQL Server 7.0 向 SQL Server 2005 传输登录和密码。
• 在运行 SQL Server 2000 的服务器之间传输登录和密码。
• 从 SQL Server 2000 向 SQL Server 2005 传输登录和密码。
注意:请查看本文末尾的备注,以了解有关下列步骤的重要信息。网页编程语言
要在不同版本的 SQL Server 之间传输登录和密码,请按下列步骤操作: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 —–

#p#分页标题#e#

编程语言原本是被设计成专门使用在计算机上的,但它们也可以用来定义算法或者数据结构。正是因为如此,程序员才会试图使程序代码更容易阅读。[1]
编程语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为在当今所有的计算都需要程序设计语言才能完成。[1]
在过去的几十年间,大量的编程语言被发明、被取代、被修改或组合在一起。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而且有许多语言对新手来说太难学;还有,不同程序之间的运行成本(runtime cost)各不相同。[1]
有许多用于特殊用途的语言,只在特殊情况下使用。例如,PHP专门用来显示网页;Perl更适合文本处理;C语言被广泛用于操作系统和编译器的开发(所谓的系统编程)。[1] c语言程序设计

 
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 登录和集成登录的说明,请查看相关文章:
(http://support.microsoft.com/kb/240872/) 如何解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。
有关使用 sp_change_users_login 存储过程逐个解决孤立用户(仅能解决从标准 SQL 登录中孤立出去的用户)的说明,请查看相关文章:
(http://support.microsoft.com/kb/274188/) PRB:联机丛书中的“孤立用户疑难解答”主题不完整。
• 如果传输登录和密码是向运行 SQL Server 的新服务器移动数据库的一部分,请查看相关文章,以了解对所涉及的工作流程和步骤的说明:
(http://support.microsoft.com/kb/314546/) 如何在运行 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 值与您要尝试添加的登录的 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 存储过程添加它。
这篇文章中的信息适用于:
• Microsoft SQL Server 7.0 标准版
• Microsoft SQL Server 2000 Personal Edition Service Pack 3
• Microsoft SQL Server 2000 标准版
• Microsoft SQL Server 2000 Workgroup Edition
• Microsoft SQL Server 2000 Developer Edition
• Microsoft SQL Server 2000 EntERPrise Edition
• Microsoft SQL Server 2005 Standard Edition
• Microsoft SQL 2005 Server Workgroup
• Microsoft SQL Server 2005 Developer Edition
• Microsoft SQL 2005 Server Enterprise

如果大家觉得收获很多,那就请大家去课课家官网一起走入知识的天堂!

    关键字:

在线提交作业