SQL Server 服务器器信息备份(一)--login新建脚本备份

前言

若你的企业使用SQL Server数据库镜像为容灾技术。

那你一定做过在镜像切换之前要新建Login,而且若Login密码不同,要修改链接数据库的字符串,在切换完之后则仍需要给数据库重新赋予权限。

若真的是这样做,不仅麻烦而且业务故障时间将会拉长,我们需要做到新建的Login与之前的密码完全一样,而且可自动根据原有数据库用户链接到Login,数据库级别权限不用从新处理。

思路

有了这样的思路则Login的信息备份需要考虑两点:

1、一定要获取用户的SID,以保证镜像切换后能自动连接到login。

2、如何将二进制类型的用户密码和SID转换成字符类型存放

数据库存一个二进制为8Bit,每四位为一个16进制。8Bit二进制除以16则取得高4Bit的二进制,模以16则取低4Bit二进制。如下所示

Substring(‘0123456789ABCDEF‘,8bit / 16 + 1,1) + Substring(‘0123456789ABCDEF‘,8bit % 16 + 1,1)

脚本

通过以上想法笔者得出以下脚本:

脚本通过循环处理分析二进制的SID和PASSWORD得到相应的字符串,拼成相应login 的新建脚本,将脚本存放到指定文件下。

  1 CREATE PROC  [dbo].[spm_GetLoginDetails]
  2     @loginame varchar(100)=null,
  3     @filepath varchar(1000)=null
  4 AS
  5     SET NOCOUNT ON
  6
  7     DECLARE @bin_pwd VARBINARY (8000)
  8     DECLARE @bin_sid VARBINARY (8000)--VARBINARY密码和sid
  9     DECLARE @string_pwd VARCHAR(8000)
 10     SET @string_pwd=‘‘
 11     DECLARE @string_sid VARCHAR(8000)
 12     SET @string_sid=‘‘
 13
 14     DECLARE @pwd INT,@sid INT
 15     /*脚本存放*/
 16     CREATE TABLE ##scriptall(id INT IDENTITY(1,1),line VARCHAR(MAX))
 17
 18     /*如果loginame 不存在则输出所有脚本*/
 19     IF @loginame IS NULL
 20     BEGIN
 21      CREATE TABLE #temp(id INT IDENTITY(1,1),name VARCHAR(100),sid VARBINARY(256),string_pwd VARCHAR(1000),string_sid VARCHAR(1000))
 22
 23      INSERT INTO #temp(sid,name)
 24      SELECT sid,name FROM   sys.sql_logins
 25
 26      DECLARE @minid INT,@maxid INT
 27      SELECT @minid=min(id),@maxid=MAX(id) FROM #temp
 28
 29      /*VARBINARY类型转化处理*/
 30      WHILE (@minid<=@maxid)
 31       BEGIN
 32             SELECT @bin_pwd = sl.password_hash,@bin_sid=sl.sid,@string_pwd=‘‘,@string_sid=‘‘
 33             FROM   sys.sql_logins sl join #temp t on t.sid =sl.sid
 34             where t.id=@minid
 35
 36             /*密码类型转化*/
 37             SELECT  @pwd = Datalength(@bin_pwd),@sid=Datalength(@bin_sid)
 38             WHILE @pwd > 0
 39               BEGIN
 40                 SELECT @string_pwd = Substring(‘0123456789ABCDEF‘,Substring(@bin_pwd,@pwd,1) / 16 + 1,1) +
 41                                      Substring(‘0123456789ABCDEF‘,Substring(@bin_pwd,@pwd,1)%16 + 1,1) + @string_pwd
 42                                      ,@pwd = @pwd - 1
 43               END
 44             SELECT @string_pwd = (‘0x‘ + @string_pwd)
 45
 46            /*sid类型转化*/
 47             WHILE @sid > 0
 48               BEGIN
 49                 SELECT @string_sid = Substring(‘0123456789ABCDEF‘,Substring(@bin_sid,@sid,1) / 16 + 1,1) +
 50                                      Substring(‘0123456789ABCDEF‘,Substring(@bin_sid,@sid,1)%16 + 1,1) + @string_sid,
 51                                      @sid = @sid - 1
 52               END
 53             SELECT @string_sid = (‘0x‘ + @string_sid)
 54             UPDATE #temp SET string_pwd=@string_pwd,string_sid=@string_sid WHERE id=@minid
 55             SET @minid=@minid+1
 56       END
 57      /*导出login新建脚本*/
 58      INSERT INTO  ##scriptall(line)
 59      SELECT CASE WHEN sp.TYPE = ‘S‘ THEN ‘
 60      /****** Object:  Login [‘+sp.name+‘]    Script Date: ‘+convert(VARCHAR,GETDATE(),25)+‘ ******/
 61      CREATE LOGIN [‘ + sp.name + ‘] WITH PASSWORD = ‘ + t.string_pwd + ‘  HASHED, SID = ‘ + t.string_sid + ‘,CHECK_POLICY = ‘ + CASE sl.is_policy_checked WHEN 0 THEN ‘OFF‘ELSE ‘ON‘END + ‘  , CHECK_EXPIRATION = ‘ + CASE sl.is_policy_checked WHEN 0 THEN ‘OFF‘ELSE ‘ON‘END +char(10)+CASE when s.denylogin=1 then ‘; DENY CONNECT SQL TO ‘ + QUOTENAME( sp.name ) else ‘‘ end +case when  s.hasaccess=0 then ‘; REVOKE CONNECT SQL TO ‘ + QUOTENAME( sp.name )  else ‘‘end
 62      ELSE
 63      ‘/****** Object:  Login [‘+sp.name+‘]    Script Date: ‘+convert(VARCHAR,GETDATE(),25)+‘ ******/
 64      CREATE LOGIN [‘ + sp.name + ‘] FROM WINDOWS WITH DEFAULT_DATABASE=[‘ + sp.default_database_name + ‘]‘
 65      END
 66       FROM   sys.sql_logins sl
 67                RIGHT JOIN sys.server_principals sp
 68                  ON sl.sid = sp.sid
 69                JOIN sys.syslogins s
 70                  ON s.sid = sp.sid
 71                left join #temp t on t.sid=sl.sid
 72       WHERE  sp.TYPE IN (‘S‘,‘G‘,‘U‘) and loginname<>‘sa‘
 73       ORDER BY sp.name
 74     END
 75     /*若存在loginame,则输出相应的脚本*/
 76     ELSE
 77     BEGIN
 78
 79     IF EXISTS (SELECT TOP 1 1 FROM   sys.sql_logins s  WHERE  s.name = @loginame)
 80       BEGIN
 81
 82         SELECT @bin_pwd = sl.password_hash,@bin_sid=sl.sid
 83         FROM   sys.sql_logins sl
 84         WHERE  sl.name = @loginame
 85         SELECT  @pwd = Datalength(@bin_pwd),@sid=Datalength(@bin_sid)
 86         /*密码类型转化*/
 87         WHILE @pwd > 0
 88           BEGIN
 89             SELECT @string_pwd = Substring(‘0123456789ABCDEF‘,Substring(@bin_pwd,@pwd,1) / 16 + 1,
 90                                    1) + Substring(‘0123456789ABCDEF‘,Substring(@bin_pwd,@pwd,1)%16 + 1,
 91                                                   1) + @string_pwd,@pwd = @pwd - 1
 92           END
 93         SELECT @string_pwd = (‘0x‘ + @string_pwd)
 94         /*SID类型转化*/
 95         WHILE @sid > 0
 96           BEGIN
 97             SELECT @string_sid = Substring(‘0123456789ABCDEF‘,Substring(@bin_sid,@sid,1) / 16 + 1,
 98                                    1) + Substring(‘0123456789ABCDEF‘,Substring(@bin_sid,@sid,1)%16 + 1,
 99                                                   1) + @string_sid,@sid = @sid - 1
100
101           END
102         SELECT @string_sid = (‘0x‘ + @string_sid)
103
104       END
105      /*导出login新建脚本*/
106      INSERT INTO ##scriptall(line)
107      SELECT CASE WHEN sp.TYPE = ‘S‘ THEN ‘
108      /****** Object:  Login [‘+sp.name+‘]    Script Date: ‘+convert(varchar,GETDATE(),25)+‘ ******/
109      CREATE LOGIN [‘ + sp.name + ‘] WITH PASSWORD = ‘ + @string_pwd + ‘  HASHED, SID = ‘ + @string_sid + ‘,CHECK_POLICY = ‘ + CASE sl.is_policy_checked WHEN 0 THEN ‘OFF‘ELSE ‘ON‘END + ‘  , CHECK_EXPIRATION = ‘ + CASE sl.is_policy_checked WHEN 0 THEN ‘OFF‘ELSE ‘ON‘END +char(10)+CASE when s.denylogin=1 then ‘; DENY CONNECT SQL TO ‘ + QUOTENAME( sp.name ) else ‘‘ end +case when  s.hasaccess=0 then ‘; REVOKE CONNECT SQL TO ‘ + QUOTENAME( sp.name )  else ‘‘end
110      ELSE
111      ‘/****** Object:  Login [‘+sp.name+‘]    Script Date: ‘+convert(varchar,GETDATE(),25)+‘ ******/
112      CREATE LOGIN [‘ + sp.name + ‘] FROM WINDOWS WITH DEFAULT_DATABASE=[‘ + sp.default_database_name + ‘]‘
113     END
114     FROM   sys.sql_logins sl
115            RIGHT JOIN sys.server_principals sp
116              ON sl.sid = sp.sid
117            JOIN sys.syslogins s
118              ON s.sid = sp.sid
119     WHERE  sp.TYPE IN (‘S‘,‘G‘,‘U‘)
120            AND sp.name = @loginame
121     END
122
123   /*结果集输出*/
124   IF @filepath IS NULL
125     BEGIN
126       SELECT   line
127       FROM     ##scriptall
128       ORDER BY id ASC
129       DROP TABLE ##scriptall
130     END
131   ELSE
132     BEGIN
133       declare @cmd varchar(1000)
134       SELECT @cmd = ‘master..xp_cmdshell ‘‘bcp "select line from  ##ScriptAll order by id" queryout ‘ + @filepath + ‘ -T -c -S‘ + @@SERVERNAME + ‘‘‘‘
135       EXEC( @cmd)
136       DROP TABLE ##scriptall
137     END

时间: 2024-07-30 10:18:15

SQL Server 服务器器信息备份(一)--login新建脚本备份的相关文章

打开SQL Server配置管理器,“无法连接到WMI提供程序,您没有权限或者该服务器无法访问。请注意,您只能使用SQL Server配置管理器来管理SQL Server 2005和更高版本的服务器。无效类[0x80041010]

我安装的版本是SQL Server2008 ,在打开SQL Server配置管理器时,遇到如图所示问题: 按照网上提供的常用的3种方法均不奏效: 1.检查一下 windows下的system32 中是否有framedyn.dll这个系统文件,如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下 我的system32 中有framedyn.dll,反而是wbem文件中没有,于是复制了一份到wbem中,然并卵! 2. 1 右击“我的电脑”-->“管理”

Windows10中“SQL Server 配置管理器”哪去了?

SQL Server 配置管理器是一种工具,用于管理与 SQL Server 相关联的服务.配置 SQL Server 使用的网络协议以及从 SQL Server 客户端计算机管理网络连接配置.SQL Server 配置管理器是一种可以通过“开始”菜单访问的 Microsoft 管理控制台管理单元,也可以将其添加到任何其他 Microsoft 管理控制台的显示界面中.Microsoft 管理控制台 (mmc.exe) 使用 Windows System32 文件夹中的 SQLServerMana

解决SQL Server管理器无法连接远程数据库Error: 1326错误

解决SQL Server管理器无法连接远程数据库Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例的问题,错误描述信息摘录如下: An error has occurred while establishing a connection to the server. (provider: Named Pipes Provider, error: 40 – Could not open a con

SQL Server服务器名称与默认实例名不一致的修复方法

SQL Server服务器名称与默认实例名不一致的修复方法 分类: 个人累积 SQl SERVER 数据库复制2011-08-10 09:49 10157人阅读 评论(0) 收藏 举报 sql server服务器sqlservermicrosoftserver远程连接 [sql] view plaincopy --原因分析: --SERVERPROPERTY 函数的 ServerName 属性与@@SERVERNAME 返回相似的信息. --ServerName 属性提供Windows 服务器和

SQL Server 服务器磁盘测试之SQLIO篇(二)

上次放出了一篇文章,针对磁盘卷簇大小默认4KB和自定义64KB进行了测试,测试内容为随机和顺序读写,大小为8KB和64KB,有人觉得这并没有照顾到SQL Server所有的IO使用情景.这篇测试文章,我们就来尽可能模拟一下SQL Server IO的行为,全方位对簇大小4KB.8KB和64KB做一次验证,注意:本次我们增加了簇为8KB的大小. 重点说明:本测试使用的是两块SSD组成的RAID1 首先,我们先来分析SQL Server的IO行为,参考网址:Choosing what SQLIO t

03.SQL Server 配置管理器基本使用

SQl Server 配置管理器(简称为配置管理器)包含了SQL Server 服务.SQL Server 网络配置和SQL Native Client配置3个工具,供数据库管理人员做服务器启动停止与监控.服务器端支持的网络协议配置.用户访问SQL Server 的网络相关设置等工作. 说明: 网络配置 SQL Server 能使用多种协议,包括Shared Memory.Named Pipes.TCP/IP和VIA.所有这些协议都有独立的服务器和客户端配置.通过SQL Server网络配置可以

SQL Server优化器特性-隐式谓词

原文:SQL Server优化器特性-隐式谓词 我们都知道,一条SQL语句提交给优化器会产生相应的执行计划然后执行输出结果,但他的执行计划是如何产生的呢?这可能是关系型数据库最复杂的部分了.这里我为大家介绍一个有关SQL Server优化器的特性-隐式谓词,并简单介绍在此特性下如何根据场景控制优化器的行为. 在这里我通过一个简单的实例来给大家说明下. code CREATE TABLE T1 (A INT, B INT) CREATE TABLE T2 (A INT, B INT) set sh

Delphi下检查SQL Server服务器当前运行状态!

Delphi下检查SQL Server服务器当前运行状态!要求:Delphi下随时监控SQL Server状态.1.命令提示符下可用:TELNET <SQL Server IP> 1433 检查.2.Delphi下如何模拟实现上述功能.----------原来做过:function GetSqlServerStatus(lpszComputerName: LPCTSTR): Integer;var  ssStatus: SERVICE_STATUS;  dwOldCheckPoint: DWO

delphi 判断SQL Server 服务器是否安装与开启

1. 问题简介: 一般情况下,使用程序连接数据库的时候,当数据库服务器不存在,或者数据库服务器没有启动的时候, 会导致数据库连接失败,所花费的时间很长.所以,在进行连接前,有必要对这些做出判断,然后返回给用户一 个正确的提示信息,减少等待的时间. 2. 数据库服务器连接不上,可以分成以下几种情况: 1>. 根本就不存在数据库服务器,及系统根本就没有安装数据库服务器. 2>. 系统安装了数据库服务器,但是数据库服务器没有开启. 3>. 数据库服务器开启了,但是处于[暂停]或者[停止]的状态