SQL Server 实例之间传输登录名和密码的详细步骤

 更新时间:2023年06月08日 14:50:02   作者:DBAGPT  
本文介绍如何在Windows上运行的SQL Server的不同实例之间传输登录名和密码,适用于SQL mirroring,SQL AG中的本地logins的迁移或者同步,需要的朋友可以参考下

简介

本文介绍如何在 Windows 上运行的 SQL Server 的不同实例之间传输登录名和密码, 适用于 SQL mirroring , SQL AG 中的本地logins的迁移或者同步。

也就说源服务器A可以是SQL mirroring , SQL AG的principal DB 或者任意 一台新的独立的SQL DB

步骤如下

1. 首先在源服务器A “master”数据库中创建两个存储过程。 过程分别名为“sp_hexadecimal”和“sp_help_revlogin”

USE [master]
  GO
  IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
  DROP PROCEDURE sp_hexadecimal
  GO
  CREATE PROCEDURE [dbo].[sp_hexadecimal]
  (
      @binvalue varbinary(256),
      @hexvalue varchar (514) OUTPUT
  )
  AS
  BEGIN
      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
  END
  go
  IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
  DROP PROCEDURE sp_help_revlogin
  GO
  CREATE PROCEDURE [dbo].[sp_help_revlogin]   
  (
      @login_name sysname = NULL 
  )
  AS
  BEGIN
      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 @Prefix                   VARCHAR(255)
      DECLARE @defaultdb                SYSNAME
      DECLARE @defaultlanguage          SYSNAME     
      DECLARE @tmpstrRole               VARCHAR (1024)
  IF (@login_name IS NULL)
  BEGIN
      DECLARE login_curs CURSOR 
      FOR 
          SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin, p.default_language_name  
          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'
          ORDER BY p.name
  END
  ELSE
          DECLARE login_curs CURSOR 
          FOR 
              SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin, p.default_language_name  
              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
              ORDER BY p.name
          OPEN login_curs 
          FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin, @defaultlanguage 
          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
                  SET @tmpstr='IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'''+@name+''')
                  BEGIN'
                  Print @tmpstr 
                  IF (@type IN ( 'G', 'U'))
                  BEGIN -- NT authenticated account/group 
                    SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']' + ', DEFAULT_LANGUAGE = [' + @defaultlanguage + ']'
                  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 + ']' + ', DEFAULT_LANGUAGE = [' + @defaultlanguage + ']'
                          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 
          SET @Prefix = '
          EXEC master.dbo.sp_addsrvrolemember @loginame='''
          SET @tmpstrRole=''
          SELECT @tmpstrRole = @tmpstrRole
              + CASE WHEN sysadmin        = 1 THEN @Prefix + [LoginName] + ''', @rolename=''sysadmin'''        ELSE '' END
              + CASE WHEN securityadmin   = 1 THEN @Prefix + [LoginName] + ''', @rolename=''securityadmin'''   ELSE '' END
              + CASE WHEN serveradmin     = 1 THEN @Prefix + [LoginName] + ''', @rolename=''serveradmin'''     ELSE '' END
              + CASE WHEN setupadmin      = 1 THEN @Prefix + [LoginName] + ''', @rolename=''setupadmin'''      ELSE '' END
              + CASE WHEN processadmin    = 1 THEN @Prefix + [LoginName] + ''', @rolename=''processadmin'''    ELSE '' END
              + CASE WHEN diskadmin       = 1 THEN @Prefix + [LoginName] + ''', @rolename=''diskadmin'''       ELSE '' END
              + CASE WHEN dbcreator       = 1 THEN @Prefix + [LoginName] + ''', @rolename=''dbcreator'''       ELSE '' END
              + CASE WHEN bulkadmin       = 1 THEN @Prefix + [LoginName] + ''', @rolename=''bulkadmin'''       ELSE '' END
            FROM (
                      SELECT CONVERT(VARCHAR(100),SUSER_SNAME(sid)) AS [LoginName],
                              sysadmin,
                              securityadmin,
                              serveradmin,
                              setupadmin,
                              processadmin,
                              diskadmin,
                              dbcreator,
                              bulkadmin
                      FROM sys.syslogins
                      WHERE (       sysadmin<>0
                              OR    securityadmin<>0
                              OR    serveradmin<>0
                              OR    setupadmin <>0
                              OR    processadmin <>0
                              OR    diskadmin<>0
                              OR    dbcreator<>0
                              OR    bulkadmin<>0
                          ) 
                          AND name=@name 
                ) L 
              PRINT @tmpstr
              PRINT @tmpstrRole
              PRINT 'END'
          END 
          FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin, @defaultlanguage 
      END
      CLOSE login_curs
      DEALLOCATE login_curs
      RETURN 0
  END

2. 在服务器A 上运行

EXEC sp_help_revlogin
-- 结果中会输出所有账户以及其加密密码

3.最后,将需要同步的账户从上一步中copy出来,到 目标SQL DB中执行即可。

参考

https://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/security/transfer-logins-passwords-between-instances 

到此这篇关于SQL Server 实例之间传输登录名和密码的文章就介绍到这了,更多相关sqlserver传输登录名和密码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何优化SQL语句的心得浅谈

    如何优化SQL语句的心得浅谈

    我们要做到不但会写SQL,还要做到写出性能优良的SQL语句
    2013-09-09
  • 自动化收集SQLSERVER诊断信息的工具选择及使用介绍

    自动化收集SQLSERVER诊断信息的工具选择及使用介绍

    相信很多人都遇到过当SQLSERVER出现问题的时候,如果想解决的话一般需要你收集一些系统信息和SQLSERVER诊断信息;接下来将介绍下工具的选择及使用,感兴趣的你可不要错过了哈,或许本文的知识点可以帮助到你
    2013-02-02
  • Sqlserver创建用户并授权的实现步骤

    Sqlserver创建用户并授权的实现步骤

    这篇文章主要介绍了Sqlserver创建用户并授权的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • SQL Server如何建表的详细图文教程

    SQL Server如何建表的详细图文教程

    创建表之前一定要先了解数据类型与约束,这样我们才能创建正确的表,下面这篇文章主要给大家介绍了关于SQL Server如何建表的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • sqlserver 触发器实例代码

    sqlserver 触发器实例代码

    何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程
    2011-12-12
  • SQL日期的计算合集

    SQL日期的计算合集

    在SQL Server中,时间和日期是常见的数据类型,也是数据处理中重要的一部分,本文将介绍SQL Server中一些常用的时间和日期函数,以及它们的用法和示例,感兴趣的可以了解一下
    2023-10-10
  • SQL Server中实现自定义数据加密功能

    SQL Server中实现自定义数据加密功能

    在当今数字化时代,数据安全已成为企业和个人最为关注的问题之一,SQL Server提供了多种数据加密技术,包括透明数据加密(TDE)、备份加密以及列级加密等,本文将详细介绍如何在SQL Server中实现自定义数据加密功能,需要的朋友可以参考下
    2024-08-08
  • 数据库清除日志文件(LDF文件过大)

    数据库清除日志文件(LDF文件过大)

    数据库清除日志文件,(LDF文件过大),一般情况下,有更简单的方法,需要在sqlserver查询执行。
    2009-11-11
  • mssql 高效的分页存储过程分享

    mssql 高效的分页存储过程分享

    废话不多说,直接上结果,相信这也是大多数搜索答案的人最愿意看的方式。
    2013-03-03
  • SQLSERVER如何查看索引缺失及DMV使用介绍

    SQLSERVER如何查看索引缺失及DMV使用介绍

    当我们发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能,在短时间之内找到一个优化的索引组合对人脑来讲,不是一件简单的事啊,所以有了本文的出现,感兴趣的你可不要错过了哈
    2013-02-02

最新评论