Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >数据库实战:SQLServer孤立用户原因和处理技巧

数据库实战:SQLServer孤立用户原因和处理技巧

原创
作者头像
小明互联网技术分享社区
发布于 2024-07-25 08:19:44
发布于 2024-07-25 08:19:44
35100
代码可运行
举报
文章被收录于专栏:SQLServerSQLServerIT技术分享社区
运行总次数:0
代码可运行

一、SQLServer孤立用户产生的原因

服务器实例上未定义或错误定义了其相应 SQL Server 登录名的数据库用户无法登录到实例。

删除了对应的 SQL Server 登录名,则数据库用户可能会变为孤立用户。

将SQL Server 数据库移动到另一台非Sa登录名的服务器时会出现这种情况。这个是大家日常遇到最多的情况。比如我们需要排查问题的时候需要从生产环境备份数据库到本地进行问题排查,如果使用的是非sa账户的话,这个时候还原到测试服务器的SQLServer时候,再使用这个非sa账户登录访问的话就会提示不能正确访问数据库 错误代码是4064。

二、原理剖析

Sql Server 的用户安全管理分两层,整个 Sql Server 服务器一层,每个数据库一层。一个用户,在每一层上都有帐号,在两个层面上都会分配不同的权利。在服务器层的帐号,交登录帐号(Login),可以设置它管理整个 Sql Server 服务器,开启跟踪,修改 Sql Server 安全配置,备份所有数据库等。在数据库一层,叫数据库用户(DataBase User),可以设置它对这个特定的数据库有读写、修改表结构、存储过程定义等权限。

服务器层面的安全,是设置在服务器的登陆账号上的。所有登录帐号的信息,可以查询 master 数据库里面的 sys.server_principals 这张视图。每个数据库内部对象的安全性,例如表格的读写,是否讷讷感运行或修改存储过程等,都赋予在数据库用户上,保存在这个数据库内部。需要通过sys.database_principals 视图进行查询。

Sql Server 登录帐号必须要和某个数据库用户相对应后,才能被数据库识别。简单来说,就是要使得用户数据库 sys.database_principals 里面 SID 和 master 数据库 sys.server_principals 里的 SID 匹配起来才可以正常访问使用。一个登录账户和数据库用户的名字可以不一样,但是 SID 必须一样。

当用户数据库恢复到新的服务器上后,master 数据库 sys.server_principals 视图里并没有这个帐号记录。但是从其他服务器还原的数据库里还有 这个数据库用户。然后这个用户被“孤立”了。

三、解决方法

解决办法一、使用sp_change_users_login存储过程

检测数据库是否存在孤立用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USE 数据库名称;
GO
 
EXEC sp_change_users_login @Action = 'Report';
GO

恢复数据库的映射关系

语法格式:exec sp_change_users_login 'UPDATE_ONE','用户名','登录名'

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Use [数据库名称]
go
sp_change_users_login 'update_one', 'test01', 'test01'

解决方法二、备份方式

如果你的测试库没有其他数据库的话,可以考虑备份的时候把系统数据库也进行备份,这样同时恢复的测试环境的时候,就不会存在孤立用户的问题。

不过一般情况下不推荐,因为测试环境的数据库只有一个情况下比较少。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL server数据库用户映射到登陆用户
    最近有朋友的SQL server数据库意外中枪,几经周折,数据将数据库恢复到新环境。恢复后在数据库级别有用户名而实例级别则无相应的登陆用户。这在SQL server数据库中是一个比较普遍的情形。本文描述的是即是对这些孤立的账户通过系统过程sp_change_users_login来建立其映射关系。
Leshami
2018/08/13
2.3K0
用sp_change_users_login消除Sql Server的孤立用户
孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。 孤立帐户的产生一般是一下两种: 1.将备份的数据库在其它机器上还原从另一个服务器恢复数据库,登录是独立的创建的(不是从其它服务器复制过来的),这个时候创建的就是孤儿用户。 2.重装系统或SQL SERVER之后只还原了用户库 解决方法是使用sp_change_users_login来修复。sp_change_users_logi
张善友
2018/01/31
1.3K0
sqlserver数据库同步工具_sql server数据库安装
看这里的name是否和你的服务器的计算机名称一样,如果一样可以跳到文档(二),否则请按如下操作更改
全栈程序员站长
2022/11/07
1.6K0
sqlserver数据库同步工具_sql server数据库安装
sqlserver简便创建用户并授权
很多研发人员程序连接SQL Server直接用的就是SA帐号。如果对数据库管理稍微严格一点的话,就不应该给应用程序这种权限,通常应用程序只需要进行增删改查,而很少有DDL操作,因此配置帐号时应该遵循“最小权限分配”的原则仅仅赋予所需的权限。
用户1217611
2019/05/25
1.8K0
SQL Server 2000遇到“用户XX已经存在”解决方案
SQL Server 2000迁移数据库文件后,在建立与原用户名相同的新用户名时,会遇到错误提示:“错误21002:[SQL-DMO]用户xxx已经存在”,这主要是由于“孤立用户”引起的。
魏杰
2022/12/23
8490
干货 | MSSQL注入和漏洞利用姿势总结
Microsoft SQL Server 是微软开发的关系型数据库管理系统。作为数据库服务器,它是一种软件产品,主要功能是根据其他软件应用程序的请求存储和检索数据,这些应用程序可以在同一台计算机上运行,也可以在网络(包括 Internet)上的另一台计算机上运行。SQL Server 默认开放的端口是 TCP 1433。
HACK学习
2023/01/03
7.1K0
干货 | MSSQL注入和漏洞利用姿势总结
SqlServer服务器和数据库角色
首先我们来阐述服务器(实例级别)的权限,实例级别和数据库级别权限的最大不同在于:实例级别的权限是直接授权给登录名,而数据库级别的全显示授予数据库用户的,然后数据库用户再与登录名匹配。(再SqlServer中,登录名和用户是两个概念,登录名用于登录到数据库实例,而用户位于数据库之内,用于和登录名匹配) 举例: --指定登录名为dbtester,并且创建test数据库中的用户tester1 execute sp_grantdbaccess ‘dbtester’,'tester1' 在服务器(实例)范围内,对
用户1217611
2018/01/30
2.5K0
SqlServer服务器和数据库角色
利用MSSQL模拟提权
在MS SQL数据库,可以使用EXECUTE AS语句,以其他用户的上下文执行SQL查询。需要注意的是只有明确授予模拟(Impersonate)权限的用户才能执行这个语句。这个权限对于多数用户不是默认配置,但是数据库管理员可能因为误配置导致权限提升。
Ms08067安全实验室
2024/06/25
1690
利用MSSQL模拟提权
镜像
数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个SQL Server数据库中。镜像不能直接访问;它只用在错误恢复的情况下才可以被访问。
jack.yang
2025/04/05
690
镜像
【SQL Servcer】添加登录账户和数据库用户
执行上面的脚本后,我们成功添加一个用户名为hechong,密码为1234的账户。可看到数据库中添加成功。
MaybeHC
2024/04/23
1.3K0
【SQL Servcer】添加登录账户和数据库用户
MsSQL编程入门-待补充
https://www.cnblogs.com/rainman/p/6203065.html
全栈工程师修炼指南
2022/09/29
5770
MsSQL编程入门-待补充
[WEB安全]MSSQL/SQL Server 提权手法详解
​ Microsoft SQLServer是一个C/S模式的强大的关系型数据库管理系统,应用领域十分广泛,从网站后台数据库到一些MIS(管理信息系统)到处都可以看到它的身影。
李鹏华
2024/03/12
8560
[WEB安全]MSSQL/SQL Server 提权手法详解
关于SQL Server 镜像数据库快照的创建及使用
从SQL Server 2005 SP1 起,SQL 开始支持数据库镜像。它的设计目的是试图为SQL Server 提供一个具有实时性数据同步的灾难恢复技术,即能够提供数据冗余备份,切换起来比较方便。每个主体数据库只能有一个镜像数据库。镜像数据库作为主体数据库的一个副本,在主体数据库发生故障、不可访问时能够迅速恢复数据库访问,提供故障恢复功能。镜像数据库一直处于“恢复”状态,因此不能被直接访问。
东山絮柳仔
2021/03/20
2.3K0
SQL 中如何给指定数据库创建只读用户?
在SQL Server 中,为了保护数据库的安全,需要给不同的使用者开通不同的访问用户,那么如何简单的控制用户的权限呢?下面我们就创建一个只读用户,给大家学习使用。
逆锋起笔
2021/11/02
4.1K0
全网最全的数据库操作命令,一口气从头看到尾,蛮有收获的!
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
网络技术联盟站
2020/10/11
1.7K0
全网最全的数据库操作命令,一口气从头看到尾,蛮有收获的!
SQLServer 中的身份验证及登录问题
SQL Server 支持两种身份验证模式,即Windows 身份验证模式和混合模式。
授客
2019/09/12
4.5K0
SQLServer 中的身份验证及登录问题
SQL SERVER几种数据迁移/导出导入的实践
SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel、数据库与文本文件、数据库与数据库之间的导出导入)。 (一)数据库与Excel 方法1: 使用数据库客户端(SSMS)的界面工具。右键选择要导出数据的数据库,选择“任务”——“导出数据”,下图1,按照向导一步一步操作即可。而导入则相反,导入时,SQLServer会默认创建一张新表,字段名也默认跟导入的Excel标题一样,并且会默认字段数据类型等。当然在可以在向导进行修改。需要注意的是如果标题不是英文而是中文
逸鹏
2018/04/10
8.7K0
SQL SERVER几种数据迁移/导出导入的实践
孤立的SQL用户
问题 最近公司很多数据库在上云,也有一部分在下云。这期间出现了很多问题,其中一个比较恶心的问题就是“孤立用户”。当数据库备份还原以后用以前的用户发现不能登录。一开始以为是登录账号没有创建,然后重新创建
用户1217611
2018/03/29
7600
孤立的SQL用户
管理SQL Server 2008 数据库角色
角色是SQL Server 2008用来集中管理数据库或者服务器的权限。数据库管理员将操作数据库的权限赋予角色。然后,数据库管理员再将角色赋给数据库用户或者登录账户,从而使数据库用户或者登录账户拥有了相应的权限。 
幽鸿
2020/04/02
2.3K0
管理SQL Server 2008 数据库角色
非域环境下使用证书设置数据库镜像
数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个SQL Server数据库中。镜像不能直接访问;它只用在错误恢复的情况下才可以被访问。 要进行数据库镜像所需的最小需求包括了两个不同的SQL Server运行环境。主服务器被称为“主机”,第二个服务器被称作“备机”。主机数据库就是你实际用着的数据库,镜像数据库就是你的数据库的备用拷贝。当事务写入你的基本服务器的时候,他们也同样被传送到并写入你的镜像数据库中。 除了基本和镜像之外,你还可以引入另一个可选的组
张善友
2018/01/19
1.2K0
相关推荐
SQL server数据库用户映射到登陆用户
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验