查看用户和登录的属性
Posted ljhdo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查看用户和登录的属性相关的知识,希望对你有一定的参考价值。
SQL Server的安全主体主要分为Login、User和Role,不仅有ID属性,还有Name属性和SID属性,SID是指Security ID。在查看用户和登录的时候,受到模拟上下文的影响。当执行EXECUTE AS命令,切换上下文之后,除了ORIGINAL_LOGIN之外,其他函数都会返回模拟上下文的Login和User信息。
一,查看数据库用户
数据库主体,可以从sys.database_principals中查看,不仅包含User,还包括数据库角色(DATABASE_ROLE)。每一个user不仅有ID属性,还有Name属性和SID属性。
数据库用户是指在特定的数据库中创建的用户,分为SQL_USER、WINDOWS_USER和WINDOWS_GROUP三种类型。用户的Name属性,是指数据库主体的name属性,用户的ID属性,是指数据库主体的principal_id属性。
1,查看数据库用户的name
查看数据库用户的name,使用CURRENT_USER 和 USER_NAME()。如果用户使用EXECUTE AS命令切换上下文,那么CURRENT_USER和 USER_NAME() 返回模拟上下文的用户的Name。如果用户通过Windows 验证返回数据库,并且是Windows Group的成员,那么CURRENT_USER和 USER_NAME()返回Windows主体的名称,而不是Group的名称。
对于CURRENT_USER
返回当前安全上下文User Name,该函数等价于USER_NAME()函数。
CURRENT_USER
比如,sysadmin 服务器角色的成员,其CURRENT_USER就是dbo。如果登录的用户是domainuser1,属于domaingroup1的成员,通过group1的权限来访问数据库,那么CURRENT_USER返回的Windows 主体的名称是domainuser1。
对于USER_NAME()函数
参数id是int类型,通过用户id来返回用户的name,如果省略参数,返回当前用户的name。
USER_NAME ( [ id ] )
对于USER
USER和 USER_NAME()函数的功能相同。
USER
2,查看数据库用户的ID
通过用户的name来查看用户的ID:
USER_ID ( [ ‘user‘ ] )
用户和角色都属于数据库主体,也可以通过DATABASE_PRINCIPAL_ID()来查看用户的ID:
DATABASE_PRINCIPAL_ID ( ‘principal_name‘ )
二,查看服务器登录
Login(登录)是服务器主体(Server Principal),除了Login之外,服务器主体还包括SERVER_ROLE。
从sys.server_principals中查看Login的属性,Login分为三个类型:SQL_LOGIN、WINDOWS_LOGIN和WINDOWS_GROUP。
每个Login都有Name属性、ID属性和一个安全标识(SID)。Login ID是指服务器主体的 principal_id属性,Login Name是指服务器主体的name属性。
1,查看Login的Name属性
通过SYSTEM_USER返回当前Login的名称:
SYSTEM_USER
通过SUSER_NAME()函数返回指定Login ID的名称,参数是Login ID(principal_id):
SUSER_NAME ( [ server_user_id ] )
如果省略参数server_user_id,那么返回当前Login的名称。
2,查看Login的ID属性
通过Login的Name来查看Login的ID属性:
SUSER_ID ( [ ‘login‘ ] )
三,SID和ID
当创建一个Login(SQL Login 或 Windows Login)时,系统会自动创建Login的 ID 和 SID,从sys.server_principals 系统视图中,看到该Login对应一个ID和SID。在SQL Server实例中,ID和SID都是唯一的,不同之处是,ID标识Login,将Login作为一个安全主体,SID标识Login的安全上下文(Security Context)。一般来说,ID可以重用,但是SID一般是不会重用的。当同一个Login重复创建时,其Login ID可能发生变化,但是其SID不变。
不仅Login有ID和SID,Database User也有。当创建一个数据库user时,从sys.database_principals中,能够看到该User被指定一个ID和SID。在数据库级别,User的ID是唯一的。
在创建User时,需要把User和Login映射起来,这就使得User和Login具有相同的SID属性。关于SID和ID的详细信息,请阅读《SIDs and IDs》
通过Login的Name查看SID:
SUSER_SID ( [ ‘login‘ ] [ , Param2 ] )
通过SID查看Login的Name属性:
SUSER_SNAME ( [ server_user_sid ] )
四,检查成员关系
检查某一个用户或Login是否属于Windows Group或Role(Database Role 或 Server Role)的成员。
1,检查当前用户是不是Windows Group和 Database Role的成员:
IS_MEMBER ( { ‘group‘ | ‘role‘ } )
2,检查指定的数据库主体是不是Database Role的成员
IS_ROLEMEMBER ( ‘role‘ [ , ‘database_principal‘ ] )
3,检查Login是不是Server Role的成员
IS_SRVROLEMEMBER ( ‘role‘ [ , ‘login‘ ] )
五,模拟上下文和原始上下文
当执行EXECUTE AS 命令之后,用户的安全上下文会被切换为指定的用户。ORIGINAL_LOGIN() 返回最原始的Login名称,不受上下文切换的影响:
ORIGINAL_LOGIN( )
其他返回用户和Login的函数,都是基于当前上下文的。
比如,SESSION_USER返回当前安全上下文的用户名称,如果该函数在EXECUTE AS 命令之后被调用,那么上下文被切换,SESSION_USER返回模拟上下文的用户名称:
SESSION_USER
参考文档:
Security Functions (Transact-SQL)
以上是关于查看用户和登录的属性的主要内容,如果未能解决你的问题,请参考以下文章
《java精品毕设》基于javaweb宠物领养平台管理系统(源码+毕设论文+sql):主要实现:个人中心,信息修改,填写领养信息,交流论坛,新闻,寄养信息,公告,宠物领养信息,我的寄养信息等(代码片段