在SQL Server的安全体系中,权限分为服务器级别(Server-Level)和数据库级别(Database-Level),获得权限的途径分为两种形式:直接授予的权限,由于加入角色而获得的权限。在安全体系中,授予权限涉及到有三种对象,分别是权限(Permission)、安全主体(Principal)和安全对象(Securable),授予权限的过程,可以用一句话概括:Grants permissions on a securable to a principal。

一,查看服务器级别的权限

在服务器级别,安全主体(Principal)是指Login和Server Role,权限对应的是服务器级别的权限。

1,查看服务器级别的安全主体

系统视图:sys.server_principals 用于查看服务器级别的安全主体:

  • name:主体的名称
  • principal_id:主体ID
  • sid:主体的SID (Security-IDentifier),如果主体是Windows的登陆或组,那么该字段是Winows SID
  • type:主体的类型,常见的主体类型是:SERVER_ROLE、SQL_LOGIN、WINDOWS_GROUP、WINDOWS_LOGIN

2,从角色而获得的权限

系统视图:sys.server_role_members 用于查看属于服务器角色(Server Role)的Login:

select r.principal_id as role_id
,r.name as role_name
,r.is_fixed_role
,r.type_desc as role_type
,m.principal_id as member_id
,m.name as member_name
,m.is_disabled
,m.type_desc as member_type
from sys.server_role_members srm
inner join sys.server_principals r
on srm.role_principal_id=r.principal_id
inner join sys.server_principals m
on srm.member_principal_id=m.principal_id

3,直接授予的权限

系统视图:sys.server_permissions,用于查看服务器级别的权限

  • class:权限存在的分类,常见的分类是:SERVER、SERVER_PRINCIPAL、ENDPOINT
  • grantee_principal_id:指定被授予权限的主体ID,grantor_principal_id 指定:授予者的主体ID。

  • type:服务器级别的权限类型(server permission type);
  • permission_name:服务器级别的权限的名称;
  • state和state_desc:权限的状态,分别是DENY、REVOKE、GRANT、GRANT_WITH_GRANT_OPTION;

如果安全主体是Login,那么查看Login被直接授予的权限;如果安全主体是Role,那么查看Role被授予的权限。

select pr.principal_id
,pr.name as principal_name
,pr.type_desc as principal_type
,pe.class_desc as class
,pe.permission_name
,pe.state_desc as state
from sys.server_principals pr
inner join sys.server_permissions pe
on pr.principal_id=pe.grantee_principal_id

二,查看Login和User的映射

Login和User 通过sid关联,用户是存在于特定数据库的安全主体,如果User没有映射到Login,那么该用户称作孤立用户(Orphaned User),也就是说,User的sid不能映射到Login的sid。

select sp.principal_id as login_id
,sp.name as login_name
,sp.type_desc as login_type
,dp.principal_id as user_id
,dp.name as user_name
,dp.type_desc as user_type
,dp.authentication_type_desc as authentication_type
from sys.server_principals sp
inner join sys.database_principals dp
on dp.sid=sp.sid

三,查看数据库级别的权限

在数据库级别,安全主体是User和Role,权限对应的是数据库级别的权限,包括操作数据库对象,执行的权限等。

1,查看数据库级别的安全主体

系统视图:sys.database_principals 用于查看数据库级别的安全主体:

  • name:主体的名称;
  • principal_id:主体ID;
  • sid:主体的SID (Security-IDentifier),如果主体是Windows的登陆或组,那么该字段是Winows SID;
  • type和type_desc:主体的类型,常见的主体类型是:SQL_USER、WINDOWS_USER、WINDOWS_GROUP、DATABASE_ROLE;
  • authentication_type:验证类型,常见的是DATABASE 和 WINDOWS;
  • owning_principal_id:安全主体(Principal)的所有者,除了数据角色之外的所有主体的所有者必须是dbo;

系统视图:sys.database_permissions 用于查看数据库级别的权限:

  • class:权限存在的分类,常见的分类是:DATABASE、OBJECT_OR_COLUMN、SCHEMA、DATABASE_PRINCIPAL
  • grantee_principal_id指定:被授予权限的主体ID,grantor_principal_id 指定:授予者的主体ID。

  • type:数据库级别的权限类型(server permission type);
  • permission_name:数据库级别的权限的名称;
  • state:权限的状态,分别是DENY、REVOKE、GRANT、GRANT_WITH_GRANT_OPTION;
  • major_id和minor_id:

安全对象(Securable):通过major_id 和 minor_id 指定安全对象

major_id:该字段共有3种类型的数值:

  • 正整数,标识数据库对象,是object_id;
  • 0,标识数据库级别的授权,class是DATABASE;
  • 负整数,标识系统对象;

minor_id:该字段共有2种类型的数值:

  • 正整数,标识的是数据库对象的column_id,该字段连接到sys.columns中的column_id;
  • 0,标识的是整个数据库对象object;

系统视图:sys.database_role_members 用于查看数据库级别的角色和数据库主体的映射关系。

2,查看数据库级别的安全主体的权限

安全主体包括User和数据库级别的role,通过以下脚本查看它们的权限,这是直接授予安全主体的权限:

select pr.principal_id
,pr.name as principal_name
,pr.type_desc as principal_type
,pr.is_fixed_role
,pr.authentication_type_desc as authentication_type
,pe.permission_name
,pe.class_desc as permission_class
,pe.state_desc as permission_state
,pe.major_id
,pe.minor_id
from sys.database_principals as pr
inner join sys.database_permissions as pe
on pe.grantee_principal_id = pr.principal_id
order by pr.name;

2,从数据库角色获得的权限

查询数据库Role的成员,可以查看数据库用户从数据库角色获得的权限:

select r.principal_id as role_id
,r.name as role_name
,r.type_desc as role_type
,r.is_fixed_role
,u.name as member_name
,u.type_desc as member_type
,u.authentication_type_desc as member_authentication
from sys.database_role_members rm
inner join sys.database_principals r
on rm.role_principal_id=r.principal_id
inner join sys.database_principals u
on rm.member_principal_id=u.principal_id
where r.type='R' --database role
order by role_name

四,查看用户在表、view或schema上的权限

用户可以被授予数据库对象上或schema上的权限

1,查看用户在对象上的权限

select pr.principal_id
,pr.name
,pr.type_desc
,pr.authentication_type_desc
,pe.permission_name
,pe.class_desc
,pe.state_desc
,o.name as object_name
,isnull(c.name,'entire_table') as column_name
from sys.database_principals as pr
inner join sys.database_permissions as pe
on pe.grantee_principal_id = pr.principal_id
inner join sys.objects as o
on pe.major_id=o.object_id
left join sys.columns c
on o.object_id=c.object_id
and pe.minor_id=c.column_id
where pe.class=1 -- Object or Column
order by pr.name
,o.name
,c.column_id;

2,查看用户在schema上的权限

select pr.principal_id
,pr.name
,pr.type_desc
,pr.authentication_type_desc
,pe.permission_name
,pe.class_desc
,pe.state_desc
,s.name as schema_name
from sys.database_principals as pr
inner join sys.database_permissions as pe
on pe.grantee_principal_id = pr.principal_id
inner join sys.schemas as s
on pe.major_id=s.schema_id
where pe.class=3 -- Object or Column
order by pr.name;

参考文档:

Getting Started with Database Engine Permissions

Security Catalog Views (Transact-SQL)

Security6:查看授予的权限的更多相关文章

  1. MySQL 查看用户授予的权限

      在MySQL中,如何查看一个用户被授予了那些权限呢? 授予用户的权限可能分全局层级权限.数据库层级权限.表层级别权限.列层级别权限.子程序层级权限.具体分类如下: 全局层级 全局权限适用于一个给定 ...

  2. Security9:查询Login被授予的权限

    在给一个Login授予权限时,发现该Login已经存在,其对应的User也存在于指定的DB中,查看该Login在指定DB中已被授予的权限. 1,查看Login的Server PrincipalID s ...

  3. 【解决】SharePoint集成模式下Reporting Service—为用户授予的权限不足,无法执行此操作。 (rsAccessDenied)

    环境:Windows Server 2008 R2 SP1,SharePoint 2010 企业版,SQL Server 2008 R2 Reporting Service(SharePoint集成模 ...

  4. oracle查看当前用户权限

    查看用户和默认表空间的关系select username,default_tablespace from dba_users;--查看当前用户能访问的表select * from user_table ...

  5. SSRS:之为用户“NT AUTHORITY\NETWORK SERVICE”授予的权限不足,无法执行此操作。 (rsAccessDenied)

    错误信息: 为用户"NT AUTHORITY\NETWORK SERVICE"授予的权限不足,无法执行此操作. (rsAccessDenied) 如图: 解决方案之检查顺序: 1. ...

  6. Microsoft Jet 数据库引擎打不开文件,它已经被别的用户以独占方式打开,或没有查看数据的权限。

    System.Data.OleDb.OleDbException (0x80004005): Microsoft Jet 数据库引擎打不开文件'D:\wwwroot\gonghouxie\wwwroo ...

  7. Oracle dba权限下修改用户密码 授予用户权限 解锁用户

    1.修改用户密码 alter user scott identified by 123 2.授予用户权限 grant connect,resource to scott 3.解锁用户 alter us ...

  8. 关于Web界面查看日志的权限问题

    关于Web界面查看日志的权限问题 @(Hadoop) 访问集群的8088端口,通过web ui查看作业日志时,发现没有权限查看,8088主界面右上角显示Logged in as : dr.who,即匿 ...

  9. 未能加载文件或程序集“Spire.Pdf, Version=4.8.8.2020, Culture=neutral, PublicKeyToken=663f351905198cb3”或它的某一个依赖项。未能授予最小权限请求

    问题:运行程序执行到代码报错:未能加载文件或程序集“Spire.Pdf, Version=4.8.8.2020, Culture=neutral, PublicKeyToken=663f3519051 ...

随机推荐

  1. 前端开发使用Photoshop切图详细步骤

    切图的主要目的是从设计师提供的psd中获取网页制作所要的资源 一.界面设置 1. 新建文件,调整界面大小,背景设置为透明 2. 自动选择,把组切换为图层 3. 添加窗口内容,一共四项:图层.历史纪录. ...

  2. 为notifyIcon.icon属性赋图片

    System.Drawing.Bitmap bp; bp = new Bitmap(Application.StartupPath + @"\image\" + MeiYeShuo ...

  3. Oracle EBS 物化视图

    怎么理解物化视图呢,先随意拿一个建物化视图的例子看一下. create materialized view EBS_ACCOUNTS_HIERARCHY_MV refresh complete on ...

  4. asp.net获取当前网址url

    asp.net获取当前网址url   设当前页完整地址是:http://www.jb51.net/aaa/bbb.aspx?id=5&name=kelli "http://" ...

  5. 解决web网站被挂马清除方法

    案例:某公司一个lamp的服务器网站站点目录下所有文件均被植入了广告脚本如下内容: <script language=javascriptsrc=http://%4%66E%78%72%67%2 ...

  6. 【转】Python学习---Socket通信原理以及三次握手和四次挥手详解

    [原文]https://www.toutiao.com/i6566024355082404365/ 什么是Socket? Socket的中文翻译过来就是"套接字".套接字是什么,我 ...

  7. 1.4环境的准备(四)之Pycharm的使用技巧

    返回总目录 目录: 1.快捷键的使用: 2.提示技巧: 3.其他技巧: (一)快捷键的使用: (1)Pycharm自带默认的快捷键 1.Ctrl + C 复制 2.Ctrl + V 粘贴 3.Ctrl ...

  8. NoSQL——not onlySQL不仅仅是SQL

    数据有很大一部分是由关系数据库管理系统(RDBMS)来处理. 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large ...

  9. Jenkins 在mac平台的安装与配置

    1. 安装: 强烈推荐直接下载war包方式安装,方便修改项目工作目录.首先确保电脑上安装了java,接着下载tomcat(任意版本).将tomcat安装在任意想要的目录,然后下载jenkins war ...

  10. 阿里八八Alpha阶段Scrum(6/12)

    今日进度 叶文滔: 修复了无法正确判断拖曳与点击的BUG,并且成功连接添加界面. 会议内容 会议照片 明日安排 叶文滔: 继续完善按钮功能 王国超: 继续攻克日程界面显示存在的BUG 俞鋆: 继续进行 ...