知方可补不足~SQL数据库用户的克隆,SQL集群的用户同步问题

我们知道在为sqlserver建立功能数据库时,通过会为库再建立一个登陆名,而这个登陆名时,只用来管理这个数据库,这是安全的,正确的。

我们在建立一个用户时,通过会把指定的数据库添加到“用户映射”里,这时你的用户与数据库就有了关系,在使用用户登陆时,你只能看到与该用户有映射关系的数据库!

在SQL的集群环境下,假设你有两台服务器,它们之间建立集群,这时,你希望把A服务器的数据库用户同步到B服务器上,你当然可以手动在B上建立一个SQL用户,但这时,你也必须重新建立一个数据库的映射关系,因为这时用户名的SID已经不同了,如果希望在建立用户时同时绑定之前的数据库映射,我们需要使用下载的语句实现

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

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 @Principal_id int
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
DECLARE @language sysname
DECLARE @rolename sysname
DECLARE login_curs CURSOR FOR SELECT
p.principal_id,
p.sid,
p.name,
p.type,
p.is_disabled,
p.default_database_name,
p.default_language_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‘

OPEN login_curs

FETCH NEXT FROM login_curs INTO @Principal_id, @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @language, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
  PRINT ‘No login(s) found.‘
  CLOSE login_curs
  DEALLOCATE login_curs
  RETURN
END
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 + ‘], DEFAULT_LANGUAGE = [‘ + @language + ‘]‘
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 = [‘ + @language + ‘]‘

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
PRINT ‘GO‘
DECLARE server_role_members_curs CURSOR FOR
SELECT
(SELECT [name] FROM sys.server_principals WHERE principal_id = role_principal_id) AS rolename
FROM
sys.server_role_members
WHERE
member_principal_id = @Principal_id
OPEN server_role_members_curs

FETCH NEXT FROM server_role_members_curs INTO @rolename
WHILE (@@fetch_status <> -1)
BEGIN
SELECT @tmpstr = ‘EXEC master..sp_addsrvrolemember @loginame = N‘‘‘ + @name + ‘‘‘, @rolename = N‘‘‘ + @rolename + ‘‘‘‘
PRINT @tmpstr
PRINT ‘GO‘
FETCH NEXT FROM server_role_members_curs INTO @rolename
END
CLOSE server_role_members_curs
DEALLOCATE server_role_members_curs
END
FETCH NEXT FROM login_curs INTO @Principal_id, @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @language, @hasaccess, @denylogin
END
CLOSE login_curs
DEALLOCATE login_curs
GO

DROP PROCEDURE #sp_hexadecimal
GO

运行的结果可能是这样的

然后我们把希望同步的用户登陆名复制到B服务器,运行脚本,即可完成同步!

时间: 2024-10-14 19:17:50

知方可补不足~SQL数据库用户的克隆,SQL集群的用户同步问题的相关文章

知方可补不足~用xsl来修饰xml

概念相关 XSL是可扩展样式表语言的外语缩写,是一种用于以可读格式呈现 XML(标准通用标记语言的子集)数据的语言. 起始于 XSL 万维网联盟(W3C)开始发展 XSL 的原因是:存在着对于基于 XML 的样式表语言的需求. CSS = HTML 样式表 HTML 使用预先定义的标签,每个标签的意义很容易被理解.HTML 中的 <table> 标签定义表格 - 并且浏览器清楚如何显示它.向 HTML 元素添加样式是很容易的.通过 CSS,很容易告知浏览器用特定的字体或颜色显示一个元素. XS

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 工具 方法

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 硬盘误格式化.重分区.重装操作系统覆盖 SQL数据解决方法 [客户名称]:贵州铜仁市开天驾驶人培训中心 [软件名称]:用友T3普及版 [数据库版本]:MS SQL server 2000  [数据库大小]:1GB X 6  (3个账套 总共6个年度). [问题描述]:由于服务器中毒或卡顿,客户将服务器电脑送到 装机店 重做操作系统.未详细告知电脑用途,导致整个硬盘被维修店技术员 全盘格式化重新分区,并且重新做好了新的操作系统,

SQL Server 2016 + AlwaysOn 无域集群

原文:SQL Server 2016 + AlwaysOn 无域集群 目录 AlwaysOn 搭建 WSFC 配置 AlwaysOn 可读副本的负载均衡 使用故障转移 [========] AlwaysOn AlwaysOn 可用性组概述 (SQL Server) 搭建 WSFC 配置计算机的 DNS 后缀 配置计算机的 DNS 后缀,注意在同个工作组 每个节点的机器都要做域名解析,修改 host 文件C:\Windows\System32\drivers\etc 安装故障转移集群 节点服务器添

java商城开发中设计的数据库处理大量数据的集群开发技术

今天作为java商城开发.java商城产品以及jsp商城开发的技术人员就来说说现在数据库处理大量数据的集群开发技术.集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术.本文就集群系统的定义.发展趋势.任务调度等问题进行了简要论述. 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配

java架构师课程、性能调优、高并发、tomcat负载均衡、大型电商项目实战、高可用、高可扩展、数据库架构设计、Solr集群与应用、分布式实战、主从复制、高可用集群、大数据

15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  clo

知方可补不足~用CDC功能来对数据库变更进行捕捉

回到目录 如果我们希望监视一个数据表的变化,在sql2008之前的版本里,在数据库端可能想到的只有触发器,或者在程序端通过监视自己的insert,update,delete来实现相应的功能,这种实现无疑是让我们感到恐惧的,不够灵活的,而当进行sql2008后,这种情况得到了本质的改变,sql2008为我们提供了CDC功能,它可以实时对指定的数据表进行监控,当前它同时对产生SQL的一些负载. CDC工作流程 CDC功能主要捕获SQLServer指定表的增删改操作,由于任何操作都会写日志(哪怕tru

知方可补不足~利用LogParser将IIS日志插入到数据库

回到目录 LogParser是微软开发的一个日志分析工具,它是命令行格式的,我们通过这个工具,可以对日志文件进行操作,对于一个几百兆的log文件,使用记事本打开是件很残酷的事,所以,很多情况下,我们都会将大日志文件的内容插入到数据库中,这样有利于我们更好的去分析系统的日志. 脚本中心给它的定义 Log Parser 2.2 是一个功能强大的通用工具,它可对基于文本的数据(如日志文件.XML 文件和 CSV 文件)以及 Windows 操作系统上的重要数据源(如事件日志.注册表.文件系统和 Act

知方可补不足~SqlServer连接的复用MultipleActiveResultSets

回到目录 MultipleActiveResultSets可以使数据库连接复用,但当你上了moebius这种集群工具后,这个选项不能开启(默认是false),当你使用EF等ORM工具时,这个选项会默认的加上了,它是为了改进程序的性能,好处就是怕数据库的连接资源被耗尽了,使用方法很简单,只需要把它加到数据的连接字符串中即可. 例如:server=(local);Integrated Security = true;database=test;MultipleActiveResultSets=tru

基于Oracle数据库锁机制,解决集群中的并发访问问题

1.需求 应用场景是这样的: 使用Oracle数据保存待办任务,使用状态字段区分任务是否已经被执行.多个Worker线程同时执行任务,执行成功或失败后,修改状态字段的值. 假设数据库表结构如下所示. create table Task( id varchar2(32), name varchar2(32), flag varchar2(1), worker varchar2(32) ); flag 可取的值包括:0-待办,1-已办,-1-失败待重试. 需要避免的问题: 多个Worker同时工作时