当数据库越来越多,连接到数据库的应用程序,服务器,账号越来越多的时候,为了既能达到满足账号操作数据权限需求,又不扩大其操作权限,保证数据库的安全性,有时候需要用角色来参与到权限管理中,通过角色做一个权限与访问用不之前的映射,可以更加方便地管理权限。

  1. USE master
  2. GO
  3. --创建一个用户
  4. CREATE LOGIN ReadUser WITH PASSWORD ='123qwe!@#',DEFAULT_DATABASE=DBTest
  5.  
  6. USE DBTest
  7. GO
  8. --创建用户,指定到上面
  9. CREATE USER ReadUser FOR LOGIN ReadUser WITH DEFAULT_SCHEMA = dbo

用SETUSER 切换到上面建的ReadUser账号下面,通过print Session_user发现已经切换到了ReadUser,以ReadUser的身份执行一个查询,

此时提示ReadUser没有DetailTable的SELECT 权限

以管理员身份授权给ReadUser查询dbo.DetailTable表的权限

再次以ReadUser的身份执行上述查询,这次发现可以正常执行了

如果允许ReadUser这个账号对当前库多张表都要有查询的全新,就要将GRANT SELECT ON TableName重复N次,
那么问题就来了,如果此时需要再建一个同样权限的用户,ReadUser2,授予同样的权限,又要重复N此GRANT操作?

此时就需要借助角色这一数据库对象来管理权限,将User加入到某一个角色中,来避免每次新增一个User都要执行一遍授权操作。

首先用管理员权限创建一个角色ReadRole

然后依次执行如下操作,将之前授权给ReadUser的权限给Revoke掉,

1,新建一个名称为ReadRole的角色

2,将多张表的查询权限授予ReadRole这一角色

3,将User加入到这个角色中

执行完成之后,我们在来尝试UserRead这个角色的权限,可以发现:角色有的权限,ReadUser也都有了

如果此时再新建一个ReadUser2

此时切换到ReadUser2的身份下,发现ReadUser2也具备了ReadRole这个自定义角色的权限

上述的ReadRole是自定义的角色,上面给他授权的是当前数据库中的部分表的SELECT权限
如果需要全库的所有表的SELECT权限,就可以借助DataBase Role来实现了,将用户加入到DataBase级别的db_dataReader这个角色中
如下截图

DataBase级别的角色作用范围是整个DB的,比如db_datareader,db_datawriter都是作用在数据库所有的对象
对于这种范围比较大而不适合使用的场景,就可以采用类似上述自定义角色,通过给角色授予指定范围内的权限的方式来实现用户权限管理

角色不仅可以在表上做权限控制和管理,也可以管理视图(查询),存储过程(执行),函数(查询),Sequence(Sequence是Update)等对象上的操作权限,通过授权给角色权限,把某一列用户加入到某一个角色中,用角色来管理用户和数据库对象之间的权限管理,可以做到更加统一地管理权限。

最后,附上两个脚本

1.查询某个角色拥有哪些权限

  1. --查询某个角色拥有的权限
  2. select USER_NAME(p.grantee_principal_id) AS principal_name,
  3. dp.principal_id,
  4. dp.type_desc AS principal_type_desc,
  5. p.class_desc,
  6. OBJECT_NAME(p.major_id) AS object_name,
  7. p.permission_name,
  8. p.state_desc AS permission_state_desc
  9. from sys.database_permissions p
  10. INNER JOIN sys.database_principals dp on p.grantee_principal_id = dp.principal_id
  11. where USER_NAME(p.grantee_principal_id) = 'ReadRole' --角色名称

2.查询某个User有哪些角色的权限(User属于哪一个(多个)角色)

  1. --某个User有哪些角色的权限(User属于哪一个(多个)角色)
  2. SELECT u.name, r.name
  3. FROM sys.database_role_members AS m
  4. INNER JOIN sys.database_principals AS r ON m.role_principal_id = r.principal_id
  5. INNER JOIN sys.database_principals AS u ON u.principal_id = m.member_principal_id
  6. WHERE u.name = 'ReadUser'; --UserName

3.查询某个账号有哪些权限,直接授权给账号的,而不是通过角色继承来的

  1. --查询某个账号有哪些权限,直接授权给账号的,而不是通过角色继承来的
  2. select USER_NAME(p.grantee_principal_id) AS principal_name,
  3. p.grantee_principal_id,
  4. dp.principal_id,
  5. dp.type_desc AS principal_type_desc,
  6. p.class_desc,
  7. OBJECT_NAME(p.major_id) AS object_name,
  8. p.permission_name,
  9. p.state_desc AS permission_state_desc
  10. from sys.database_permissions p
  11. INNER JOIN sys.database_principals dp on p.grantee_principal_id = dp.principal_id
  12. where USER_NAME(p.grantee_principal_id) = 'ReadUser'

4.查询一个UserName拥有的所有权限(通过角色集成的权限和自身具备的权限)

  1. --查询一个UserName拥有的角色以及角色拥有的操作对象
  2. DECLARE @login_name varchar(100) = 'XXX'
  3.  
  4. ;WITH LoginName
  5. AS
  6. (
  7. SELECT u.name AS LoginName,
  8. r.name AS RoleName,
  9. role_principal_id AS PrincipalId
  10. FROM sys.database_role_members AS m
  11. INNER JOIN sys.database_principals AS r ON r.principal_id = m.role_principal_id
  12. INNER JOIN sys.database_principals AS u ON u.principal_id = m.member_principal_id
  13. ),
  14. UserPermission
  15. AS
  16. (
  17. select USER_NAME(p.grantee_principal_id) AS principal_name,
  18. dp.principal_id AS principal_id,
  19. dp.type_desc AS principal_type_desc,
  20. p.class_desc AS class_desc,
  21. OBJECT_NAME(p.major_id) AS object_name,
  22. p.permission_name AS permission_name,
  23. p.state_desc AS permission_state_desc
  24. from sys.database_permissions p
  25. INNER JOIN sys.database_principals dp on p.grantee_principal_id = dp.principal_id
  26. )
  27. SELECT * FROM
  28. (
  29.  
  30. --通过角色获取的权限对象
  31. SELECT u.LoginName,
  32. u.RoleName,
  33. p.principal_type_desc,
  34. p.class_desc,
  35. p.permission_name,
  36. p.object_name,
  37. p.permission_state_desc
  38. FROM LoginName u left join UserPermission p on p.principal_name = u.RoleName
  39. WHERE u.LoginName = @login_name
  40.  
  41. UNION ALL
  42. --直接授权给账号的权限对象
  43. select @login_name AS LoginName,
  44. '' AS RoleName,
  45. dp.type_desc AS principal_type_desc,
  46. p.class_desc AS class_desc,
  47. p.permission_name AS permission_name,
  48. OBJECT_NAME(p.major_id) AS object_name,
  49. p.state_desc AS permission_state_desc
  50. from sys.database_permissions p
  51. INNER JOIN sys.database_principals dp on p.grantee_principal_id = dp.principal_id
  52. where USER_NAME(p.grantee_principal_id) = @login_name
  53.  
  54. UNION ALL
  55. --固定服务器角色的权限
  56. SELECT r.name ,
  57. cast(r.principal_id as varchar(10)) ,
  58. r.type_desc,
  59. null as class_desc,
  60. null as object_name,
  61. p2.name as permission_name,
  62. null as permission_state_desc
  63. FROM sys.server_principals r
  64. INNER JOIN sys.server_role_members m ON r.principal_id = m.member_principal_id
  65. INNER JOIN sys.server_principals p1 ON p1.principal_id = m.member_principal_id
  66. INNER JOIN sys.server_principals p2 ON p2.principal_id = m.role_principal_id
  67. WHERE r.name = @login_name
  68. )t

SQL Server 用角色(Role)管理数据库权限的更多相关文章

  1. SQL Server 2012实施与管理实战指南(笔记)——Ch5启动SQL Server服务和数据库

    5.启动SQL Server服务和数据库 在数据库和服务启动过程中,经常会出现的问题: 1.SQL Server实例无法正常启动 2.系统数据库无法正常启动 3.网络配置失败 4.用户数据库无法启动 ...

  2. SQL Server中查询用户的对象权限和角色的方法

    --SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_h ...

  3. SQL Server 2008 错误15023:当前数据库中已存在用户或角色

    解决SQL Server 2008 错误15023:当前数据库中已存在用户或角色,SQLServer2008,错误15023,在使用SQL Server 2008时,我们经常会遇到一个情况:需要把一台 ...

  4. Sql Server来龙去脉系列 必须知道的权限控制核心篇

    最近写了<Sql Server来龙去脉系列  必须知道的权限控制基础篇>,感觉反响比较大.这可能也说明了很多程序猿对数据库权限控制方面比较感兴趣,或者某些技术点了解的没有很透彻. 有些人看 ...

  5. 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

    对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...

  6. 第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  7. Sql Server来龙去脉系列 必须知道的权限控制基础篇

    题外话:最近看到各种吐槽.NET怎么落寞..NET怎么不行了..NET工资低的帖子.我也吐槽一句:一个程序猿的自身价值不是由他选择了哪一门技术来决定,而是由他自身能创造出什么价值来决定. 在进入本篇内 ...

  8. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  9. 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志

    SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列   本文是Stairway系列的一部分:SQL ...

随机推荐

  1. SSH框架总结(环境搭建+框架分析+实例源码下载)

    一.SSH框架简介 SSH是struts+spring+hibernate集成的web应用程序开源框架. Struts:用来控制的,核心控制器是Controller. Spring:对Struts和H ...

  2. RISC与CISCCPU构架

    RISC 精简指令集 CISC复杂指令集 CISC架构的代表: x86, C51 RISC架构的代码:arm, mips,powerpc, avr, pic 指令集的区别 首先从字面上理解就能知道, ...

  3. Call to undefined function think\finfo_open()

    Fileinfo 扩展 - Linux面板- 宝塔面板 上传文件,出现错误 安装的fileinfo扩展

  4. 在Django中运行脚本文件以及打印出SQL语句。

    Django终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_lo ...

  5. bzoj2555 substring(LCT 后缀自动机)

    /* 动态求right集合的大小 LCT维护parent树即可 注意 由于树是有向的不会换根并且每次操作单一, 于是不需要维护子树和(写起来很麻烦) 直接打标记修改即可 */ #include< ...

  6. Vue项目,运行出现warning(Emitted value instead of an instance of Error)

    组件:<XXXX v-for="item in items" /> warning:(Emitted value instead of an instance of E ...

  7. 快速了解CSS3当中的HSLA 颜色值怎么算

    CSS3文档中提到:(HSLA) H是色度,取值在0度~360度之间,0度是红色,120度是绿色,240度是蓝色.360度也是红色. S是饱和度,是色彩的纯度,是一个百分比的值,取值在0%~100%, ...

  8. 8.2.优化SQL语句

    8.2.优化SQL语句 数据库应用程序核心操作逻辑都是通过执行SQL语句来执行,不管是直接通过解释器还是通过后台API提交. 调优手册里面的这一节内容帮助各种各样MySQL程序加快速度.手册包括SQL ...

  9. for循环、in、not in

    for循环可以遍历集合中任意一个元素 1 a = ["hello", "world", "dlrb"] 2 for b in a: 3 pr ...

  10. elk之[logstash-input-file]插件使用详解

    https://www.cnblogs.com/xing901022/p/4805586.html http://www.cnblogs.com/xing901022/p/4802822.html   ...