“孤立”用户

在数据库安全体系中,Login和User是两个最基本的安全主体(Principal),Login用于登陆到SQL Server实例,而User用于访问数据库。Login和User之间有一个映射关系,通过SID(安全标识,Security ID)连接到一起。在一个数据库中,如果一个User没有相应的Login,称作孤立用户(Orphaned User),也就是说,该User的SID存在于sys.database_principals 中, 而不存在于 sys.server_principals 中。一般情况下,把备份的数据库还原到在其它SQL Server实例之后,会产生孤儿用户。还有一种情况,孤立用户是DBA故意创建的,通过权限模拟来实现特定的系统维护任务。

一,检查和修复孤立用户

Login 和 User的映射关系是通过SID来关联的,如果一个SID 存在于sys.database_principals,而不存在于  sys.server_principals,那么这个User 除非是system user,否则就是孤立用户。出现孤立用户的根本原因是:数据库User没有对应的Login,解决孤立用户问题的方法是:创建Login,建立Login和孤立用户之间的映射。

1,使用以下脚本查看孤立用户

在查看孤立用户时,应该过滤掉系统预先创建的用户,例如,dbo、sys和guest(来宾用户),一般情况下,只查看SQL User,Windows Users和Windows Group这三个安全主体类型,通过以下脚本查看孤立用户,并修复孤立用户。大多数情况下,在把数据库备份还原到不同的SQL Server实例时,会出现孤立用户。

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_id
from sys.database_principals dp
left join sys.server_principals sp
    on dp.sid=sp.sid
where sp.sid is null
    and dp.[type] IN (N‘U‘, N‘S‘,N‘G‘)
    and dp.is_fixed_role = 0
    and dp.[Name] NOT IN (N‘dbo‘, N‘guest‘, N‘sys‘, N‘INFORMATION_SCHEMA‘)

在视图 sys.database_principals中,Principal的类型注释如下:

  • S = SQL user
  • U = Windows user
  • G = Windows group

2,创建Windows Login

创建Windows Login,Logon Name的格式是:[<domainName>\<login_name>]

CREATE LOGIN [DomainName\WindowsLoginName] -- or [DomainName\WindowsGroupName]
FROM WINDOWS WITH DEFAULT_DATABASE=[master],
DEFAULT_LANGUAGE=[us_english]

3,重新创建Login 和 name之间的映射关系

通过为User指定新的Login,重新把User映射到Login。Login 和User的映射关系是通过SID(security Identifier)来关联的,在重新映射时,数据库引擎会把User的SID修改为Login的SID,以建立映射关系。

ALTER USER userName
WITH LOGIN = loginName

注:The WITH LOGIN clause enables the remapping of a user to a different login.

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

对于孤立用户,由于User  Name和 Login Name之间没有直接的关系,因此,完全修复孤立用户的可能性几乎是没有的。在特定的情况下,当使用Windows验证创建User和Login时,把User Name 和 Login Name设置成相同的,这样,可以检测数据库的User是否有对应的Login;如果没有对应的Login,管理员可以新建相应的Windows Login,重建映射关系,进而修复孤立用户。

以下是自动修复孤立用户的脚本,仅供参考:

 

三,来宾用户(guest)

登录(Login)用于用户身份验证,而数据库用户(User)用于数据库的访问和权限验证。登录(Login)通过安全识别符 (SID) 与用户(User)关联。如果数据库中不存在针对特定登录(Login)的用户(User),使用该登录(Login)的用户即使能够连接到 SQL Server 服务器,也无法访问数据库。但是,该情形的唯一例外是当数据库包含“guest”用户(User)时,与用户(User)不关联的登录(Login)将被映射到 guest 用户。如果存在数据库用户(User),但没有与其关联的登录(Login),则该用户将无法登录到 SQL Server 服务器中。

四,创建孤立用户

通过Create User 命令创建User和Login之间的映射关系,上文提到,这种映射关系是通过SID来关联的,即Login访问数据库使用的User的SID和Login相同。

在创建新的User时,指定关联的Login,就可以创建User和Login的映射关系,脚本如下:

CREATE USER user_name
--FOR LOGIN login_name
[ WITH DEFAULT_SCHEMA = schema_name ] 

在创建User时,如果没有指定for login子句,那么新建的User是孤立用户,一般用作系统维护等特殊用途。

参考文档:

Fixing orphaned database users in 2005 to 2012 – T-SQL Tuesday #025

Do you still use sp_change_users_login instead of ALTER USER UserName WITH LOGIN = UserName

时间: 2024-10-04 02:23:38

“孤立”用户的相关文章

SQL Server数据库中还原孤立用户的方法集合

SQL Server数据库中还原孤立用户的方法集合 虽然SQL Server现在搬迁的技术越来越多,自带的方法也越来越高级. 但是我们的SQL Server在搬迁的会出现很多孤立用户,微软没有自动的处理. 因为我们的数据库权限表都不会在应用数据库中,但是每次对数据库作迁移的时候,单个数据库却带着它的数据库用户对象. 并且我们在新的数据库机器上也不能登录这些账号,但是它却静悄悄的存在我们的数据库中. 微软以前提供的一个老的接口存储过程来处理这个问题. sp_change_users_login 将

sqlserver孤立用户解决

孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录. 孤立帐户的产生一般是一下两种:1.将备份的数据库在其它机器上还原:2.重装系统或SQL SERVER之后只还原了用户库 解决方法是使用sp_change_users_login来修复. sp_change_users_login的用法有三种 用法1:exec sp_change_users_login 'REPORT' 列出当前数

在其他電腦上還原服務器上的備份數據庫時,會提示無法訪問用--&gt;sp_change_users_login消除Sql Server的孤立用户

每次从服务器上备份好数据库(Sql Server数据库),如果将备份数据库文件在本地恢复,总会产生用户权限的问题. 经过很多次的实验后,我发现有那么一条语句可以发挥作用,就是sp_change_users_login语句. 具体用法:EXEC sp_change_users_login 'Update_One', '用户名', '登录名'; 擴展: 孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中

桦仔 笔记6-徐 检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题

1 --检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题 2 --注意:重新链接只能链接SQL登录帐号,不能链接Windows登录帐号 3 --如果不选择重新链接可以使用备份master数据库的方法还原到新的服务器上,可以避免一个数据库有 4 --成千上百个数据库用户的情况 5 SELECT * FROM sys.server_principals 6 SELECT * FROM sys.database_principals 7 8 --检测孤立用户 9 USE GPOSDB

sp_change_users_login解决孤立用户问题

孤立帐户,指的是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录. 孤立帐户的产生一般是一下两种: 1.将备份的数据库在其它机器上还原: 2.重装系统或SQL SERVER之后只还原了用户库 解决方法是使用sp_change_users_login来修复,方法步骤: 1.windows账户或sa登陆,切换至用户库,列出当前数据库的孤立用户 exec sp_change_users_login '

解决SQL Server数据库的孤立用户问题

use 数据库名称 go --使用 sp_change_users_login 修复产生的孤立账户 --列出当前数据库的孤立用户 exec sp_change_users_login 'report' --可以自动将用户名所对应的同名登录添加到 syslogins 中 exec sp_change_users_login 'auto_fix','用户名' --将用户名映射为指定的登录名. exec sp_change_users_login 'update_one','用户名','登陆名'

sqlserver 2008 孤立用户解决方法

从别一台服务器上得到一个数据库备份.还原到本地,数据库中的用户无法登录,也就是联机帮助中说的还原备份可能产生的孤立用户问题. 一.新建一个 MyDataBase 数据库 二.把备份文件放到 C 盘根目录下 三.sa 连接数据库,选中 任意库.,执行 下面脚本 RESTORE DATABASE MyDataBase FROM DISK = 'C:\MyDataBase.BAK' WITH REPLACE go 四.选择MyDataBase 执行下面脚本 EXEC PRO_DBT_CHANGE_US

sql server中的孤立用户

此问题出现在数据库的移值上.移值后,数据库的登陆名和数据库用户名孤立,原数据中,用建立的用户名密码登陆可以访问数据库,但是移值后就不能访问了.而且如果您尝试向该登录帐户授予数据库访问权限,则会因该用户已经存在而出现以下错误信息:     '该登录已经在另一个用户名下拥有帐户'. 产生错误的原因是:            在您向目标服务器传输登录帐户和密码后,您的用户可能还无法访问数据库.登录帐户与用户是靠安全识别符   (SID)   关联在一起的:在您移动数据库后,如果   SID   不一致

用sp_change_users_login消除Sql Server的孤立用户

每次从服务器上备份好数据库(Sql Server数据库),如果将备份数据库文件在本地恢复,总会产生用户权限的问题. 经过很多次的实验后,我发现有那么一条语句可以发挥作用,就是sp_change_users_login语句. 具体用法:EXEC sp_change_users_login 'Update_One', '用户名', '登录名'; 比如,原来在你本地数据库中有一个用户名是aa,这个数据库是远程数据库在本地的备份,当然远程数据库中也有这个用户名.每次在远程备份后,再在本地恢复,那么本地机