实例之间传输登录和密码

简介

正文介绍如何在差异服务器上的 Microsoft SQL Server 二零零六实例之间传输登入和密码。

关于怎么样在其余版本的 SQL
Server 实例之间传输登入和密码的更多音信,请单击下边包车型客车稿子编号,以查看
Microsoft 知识库中相应的篇章:

246133 哪些在 SQL
Server 实例之间传输登入和密码

更加的多新闻

在本文中,服务器 A 和服务器 B 是不一样的服务器。另外,服务器 A 和服务器 B
都在运作 SQL Server 二零零七。

在将三个数据库从服务器 A 上的 SQL Server 实例移动到服务器 B 上的 SQL
Server 实例之后,顾客可能不可能登陆到移至服务器 B
上的数据库。何况,顾客恐怕会收到以下音信:

客户“MyUser”登陆退步。(Microsoft
SQL Server,错误:18456)

出现此难点的案由是,您未将登入和密码从服务器 A 上的 SQL Server
实例传输到服务器 B 上的 SQL Server 实例。

若要将登录和密码从服务器 A 上的 SQL Server 实例传输到服务器 B 上的 SQL
Server 实例,请试行以下步骤:

  1. 在服务器 A 上,运行 SQL Server Management
    Studio,然后连接到要从中移动数据库的 SQL Server 实例。
  2. 开采新的询问编辑器窗口,然后运营以下脚本。

    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 (514) OUTPUT
    AS
    DECLARE @charvalue varchar (514)
    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 @type varchar (1)
    DECLARE @hasaccess int
    DECLARE @denylogin int
    DECLARE @is_disabled int
    DECLARE @PWD_varbinary  varbinary (256)
    DECLARE @PWD_string  varchar (514)
    DECLARE @SID_varbinary varbinary (85)
    DECLARE @SID_string varchar (514)
    DECLARE @tmpstr  varchar (1024)
    DECLARE @is_policy_checked varchar (3)
    DECLARE @is_expiration_checked varchar (3)
    
    DECLARE @defaultdb sysname
    
    IF (@login_name IS NULL)
      DECLARE login_curs CURSOR FOR
    
          SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
    sys.server_principals p LEFT JOIN sys.syslogins l
          ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
    ELSE
      DECLARE login_curs CURSOR FOR
    
          SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
    sys.server_principals p LEFT JOIN sys.syslogins l
          ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
    OPEN login_curs

    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
    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 ''
    WHILE (@@fetch_status <> -1)
    BEGIN
      IF (@@fetch_status <> -2)
      BEGIN
        PRINT ''
        SET @tmpstr = '-- Login: ' + @name
        PRINT @tmpstr
        IF (@type IN ( 'G', 'U'))
        BEGIN -- NT authenticated account/group

          SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
        END
        ELSE BEGIN -- SQL Server authentication
            -- obtain password and sid
                SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
            EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
            EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

            -- obtain password policy state
            SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
            SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name

                SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'

            IF ( @is_policy_checked IS NOT NULL )
            BEGIN
              SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
            END
            IF ( @is_expiration_checked IS NOT NULL )
            BEGIN
              SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
            END
        END
        IF (@denylogin = 1)
        BEGIN -- login is denied access
          SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
        END
        ELSE IF (@hasaccess = 0)
        BEGIN -- login exists but does not have access
          SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
        END
        IF (@is_disabled = 1)
        BEGIN -- login is disabled
          SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
        END
        PRINT @tmpstr
      END

      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
       END
    CLOSE login_curs
    DEALLOCATE login_curs
    RETURN 0
    GO

注意:此脚本会在“master”数据库中创建两个存储过程。两个存储过程分别命名为“sp\_hexadecimal”存储过程和“sp\_help\_revlogin”存储过程。
  1. 运维下边包车型大巴话语。

    EXEC sp_help_revlogin
    

    由“sp_help_revlogin”存款和储蓄进度生成的出口脚本是登陆脚本。此登陆脚本创设具备原始安全标志符
    (SID) 和原本密码的记名。

  2. 在服务器 B 上,运维 SQL Server Management
    Studio,然后连接到您将数据库移动到的 SQL Server 实例。

    第一音信:在实行步骤
    5 从前,请检查“备注”一节中的消息。

  3. 开荒新的询问编辑器窗口,然后运维步骤 3 中变化的出口脚本。

备注

在对服务器 B 的实例上运营输出脚本此前,请检查以下新闻:

  • 紧凑检查输出脚本。纵然服务器 A 和服务器 B
    处在不相同的域中,则必得修改出口脚本。然后,必需在 CREATE LOGIN
    语句中央银行使新的域名来替换原始域名。新的域中授予访谈权限的集成登入不会有着与原始域中的登陆一样的
    SID。因而,客户会从这么些登陆中孤立出来。 有关怎么着化解那个孤立客户的愈来愈多音信,请单击下边包车型客车篇章编号,以查看
    Microsoft 知识库中相应的稿子:
[240872 ](https://support.microsoft.com/zh-cn/help/240872)如何解决在运行
SQL Server 的服务器之间移动数据库时的权限问题  

如果服务器 A 和服务器 B 处于同一域中,则使用相同的
SID。因此,用户不可能是孤立的。
  • 在输出脚本中,通过应用加密密码来创制登入。这是因为 CREATE LOGIN
    语句中利用了 HASHED 参数。此参数钦命在 PASSWO本田CR-VD
    参数后输入的密码已通过哈希管理。
  • 暗中认可情形下,独有“sysadmin”固定服务器剧中人物的成员能够从“sys.server_principals”视图运行SELECT
    语句。除非“sysadmin”固定服务器角色的积极分子授予客户必需的权杖,不然客户无法成立或运营输出脚本。
  • 本文中的步骤不会为一定登陆传输暗中同意数据库新闻。那是因为暗中认可数据库不容许总是存在于服务器
    B 上。若要定义某些登陆的私下认可数据库,请使用 ALTE中华V LOGIN
    语句,并传播登入名和暗中同意数据库作为参数。
  • 服务器 A 的排序依次或者不区分轻重缓急写,而服务器 B
    的排序依次恐怕区分轻重缓急写。在此情状下,当你将登陆和密码传输到服务器 B
    上的实例之后,必得以大写字母的样式来键入密码中的全部字母。

    抑或,服务器 A 的排序依次恐怕区分轻重缓急写,而服务器 B
    的排序依次大概不区分轻重缓急写。在此意况下,您将不能够利用传输到服务器 B
    上的实例的报到和密码实行登录,除非知足上边包车型大巴准绳之一:

    • 原本密码不分包字母。
    • 原始密码中的全部字母都是大写字母。

    服务器 A 和服务器 B
    的排序依次大概都分别轻重缓急写,也许只怕都不区分轻重缓急写。在那一个意况下,客商不会境遇难点。

  • 业已位于服务器 B
    上的实例中的登录大概持有与出口脚本中的某些名称一致的名号。在此情形下,当对服务器
    B 上的实例运营输出脚本时,会收取到上面包车型客车错误信息:
    音信 15025,品级 16,状态 1,行 1
    服务器主体 ‘MyLogin’
    已存在。

    附近地,已经放在服务器 B 上的实例中的登陆恐怕具有与输出脚本中的有些SID 一样的 SID。在此情况下,当对服务器 B
    上的实例运转输出脚本时,会收下到上面包车型客车一无可取音信:
    新闻 15433,等级 16,状态 1,行 1
    所提供的参数 sid 正在使用。

    所以,必需推行以下操作:

    1. 紧凑检查输出脚本。
    2. 反省服务器 B 上的实例中的“sys.server_principals”视图的剧情。
    3. 相应地消除那些不当新闻。
  • 在 SQL Server 2006 中,登陆的 SID
    用作落成数据库等级访问的底蕴。贰个签到也许在服务器的三个分化数据库中持有七个不等的
    SID。在此景况下,该登九只能访问具备与“sys.server_principals”视图中的
    SID 匹配的 SID
    的数据库。在从七个例外的服务器合併那四个数据库时,可能会冒出此主题素材。若要化解此难题,可采取DROP USERT 语句,从有着不相配的 SID
    的数据库中手动删除相应的报到。然后,通过应用 CREATE USEEnclave语句再一次增加该登入。

参考

有关怎么着减轻孤立客商难题的更加多音讯,请访谈以下 Microsoft Developer
Network (MSDN) 网址:

关于 CREATE LOGIN 语句的越来越多音讯,请访谈上边包车型大巴 MSDN 网站:

关于 ALTE奥迪Q3 LOGIN 语句的越来越多音信,请访谈上边包车型地铁 MSDN 网址:

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注