博客
关于我
“孤立”用户
阅读量:774 次
发布时间:2019-03-23

本文共 2621 字,大约阅读时间需要 8 分钟。

SQL Server孤立用户问题的全面解决方案

在数据库安全体系中,Login和User是两个最基础的安全主体(Principal)。Login用于登录到SQL Server实例,而User用于访问数据库。两者通过安全标识(SID)相互关联。在一个数据库中,如果一个User没有相应的Login,则被称为孤立用户(Orphaned User)。孤立用户的 SID 存在于 sys.database_principals 中,但不存在于 sys.server_principals 中。

一、检查和修复孤立用户

Login 和 User 的映射关系通过 SID 来实现。如果一个 SID 存在于 sys.database_principals 中但不存在于 sys.server_principals 中,则该 User 除非是系统用户,否则就是孤立用户。

步骤 1:自定义查看孤立用户

下面提供一个 SQL脚本来查看孤立用户:

SELECT dp.name AS UserName,        dp.type,        dp.type_desc,        dp.default_schema_name,        dp.is_fixed_role,        dp.authentication_type,        dp.authentication_type_desc,        dp.sid,        dp.principal_idFROM sys.database_principals dpLEFT JOIN sys.server_principals sp    ON dp.sid = sp.sidWHERE sp.sid IS NULL    AND dp.[type] IN ('U', 'S', 'G')   AND dp.is_fixed_role = 0   AND dp.[Name] NOT IN ('dbo', 'guest', 'sys', 'INFORMATION_SCHEMA');

步骤 2:创建新的 Windows Login

创建 Windows Login 时,Logon Name 的格式为:[DomainName\LoginName](或 DomainName\GroupName)。

CREATE LOGIN [DomainName\WindowsLoginName]FROM WINDOWSWITH DEFAULT_DATABASE = [master],DEFAULT_LANGUAGE = [us_english];

> **步骤 3:重新映射 Login 和 User**> 为避免孤立用户出现,可以通过以下方式重新创建映射关系:>```sqlALTER USER userName WITH LOGIN = loginName;

请注意:WITH LOGIN 子句允许为 User 分配新的 Login,并建立映射关系。

二、自动修复孤立用户问题

修复孤立用户并非完全没有可能性。对于通过 Windows 身份验证创建的 User 和 Login,建议将它们的 Name 设置为相同,这样可以更好地检测到对应的 Login 是否存在。如果检测到不存在对应的 Login,管理员可以创建相应的 Windows Login 以恢复映射关系。

以下是一个自动化修复孤立用户的 SQL 脚本:

-- 变量声明DECLARE @username sysname;-- 数据库选择游标DECLARE cur_orphaned CURSOR LOCAL FORWARD_ONLY, FAST_FORWARD, READ_ONLY;-- 查看孤立用户SELECT dp.name AS UserName FROM sys.database_principals dpLEFT JOIN sys.server_principals sp ON dp.sid = sp.sidWHERE sp.sid IS NULL AND dp.[type] IN ('U', 'G')    AND dp.is_fixed_role = 0    AND dp.[Name] NOT IN ('dbo', 'guest', 'sys', 'INFORMATION_SCHEMA');-- 打开游标OPEN cur_orphaned;-- 从游标中读取 UserNameFETCH NEXT FROM cur_orphaned INTO @username;WHILE @@FETCH_STATUS = 0BEGIN   -- 创建新的 Windows Login   SET @sqlcmd = N'CREATE LOGIN [' + @username + N'] FROM WINDOWS';   EXEC (@sqlcmd);   -- 为 User 分配新的 Login   SET @sqlcmd = N'ALTER USER [' + @username + N'] WITH LOGIN = [' + @username + N']';   EXEC (@sqlcmd);   FETCH NEXT FROM cur_orphaned INTO @username;ENDCLOSE cur_orphaned;DEALLOCATE cur_orphaned;

三、来宾用户(Guest)

数据库中的 Guest 用户可以通过特殊的登录来访问数据库,但必须确保其与 SQL Server 中的登录关联。如果没有对应的登录,该 User 将无法访问数据库。

四、创建孤立用户

在 SQL Server 中,创建孤立用户通常用于系统维护或特定用途。默认情况下,创建 User 时并不会自动关联到 Login。以下是创建孤立用户的示例:

CREATE USER user_name -- 如果没有指定 FOR Login子句,则创建孤立用户。FOR LOGIN login_name [WITH DEFAULT_SCHEMA = schema_name];

####-reference

  • 如需进一步了解 SQL Server 的安全原理和用户管理,请参考相关技术文档。

转载地址:http://idfzk.baihongyu.com/

你可能感兴趣的文章
Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
查看>>
Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
查看>>
Openlayers高级交互(2/20):清除所有图层的有效方法
查看>>
Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
查看>>
Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
查看>>
Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
查看>>
Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
查看>>
Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
查看>>
Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
查看>>
Openlayers高级交互(8/20):选取feature,平移feature
查看>>
Openlayers高级交互(9/20):编辑图形(放缩、平移、变形、旋转),停止编辑
查看>>
Openlayers:DMS-DD坐标形式互相转换
查看>>
openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
查看>>
OpenLDAP(2.4.3x)服务器搭建及配置说明
查看>>
OpenLDAP编译安装及配置
查看>>
Openmax IL (二)Android多媒体编解码Component
查看>>
OpenMCU(一):STM32F407 FreeRTOS移植
查看>>
OpenMCU(三):STM32F103 FreeRTOS移植
查看>>
OpenMCU(三):STM32F103 FreeRTOS移植
查看>>
OpenMCU(二):GD32E23xx FreeRTOS移植
查看>>