标签:SQL SERVER/MSSQL SERVER/数据库/DBA/权限控制/管理/分配/登入名/数据库用户/角色

概述

对数据库系统而言,保证数据的安全性永远都是最重要的问题之一。一个好的数据库环境,必须明确每个用户的职责,并分配其对应的权限。同时出现问题了也可以找到根源。

你是否会有这样的需求:

  1. 给某个用户查询所有数据库的权限
  2. 给某个用户只有备份数据库的权限
  3. 给一个用户只有指定数据库的权限
  4. 给一个用户只有某个表的权限
  5. 给一个用户只有查看某些对象(例如:视图)的权限
  6. 给一个用户只有执行一些存储过程的权限

目录

元素

文章可能会有些枯燥,还望耐心,相信应该有你想要的。

登入名

只有拥有了登入名才能访问实例(sql server).

角色

角色是一类权限的组合。

  • 数据库角色的拥有者可以是用户也可以是数据库角色本身,管理员可以创建数据库角色,也可以勉强将数据库角色理解为一组相同权限的用户,为什么这么说呢,因为数据库角色和数据库用户不允许存在同名。

注意:不要将用户创建的数据库角色添加到固定的服务器数据库角色当中去,否则将导致固定的数据库角色的权限升级。

  • 服务器角色的拥有者只有登入名,服务器角色是固定的,用户无法创建服务器角色。

注意:一般不建议给用户直接分配服务器角色,因为服务器角色是全局的,也就是说你拥有了服务器级别的权限,一般建议给用户分配数据库,然后给对应的数据库分配数据库角色权限。

用户

用户是数据库级的概念,数据库用户必须绑定具体的登入名,你也可以在新建登入名的时候绑定此登入名拥有的数据库,当你绑定登入名数据库后,数据库默认就创建了此登入名同名的数据库用户,登入名与数据库用户之间就存在关联关系,数据库用户是架构和数据库角色的拥有者,即你可以将某个架构分配给用户那么该用户就拥有了该架构所包含的对象,你也可以将某个数据库角色分配给用户,此用户就拥有该数据库角色的权限。

架构

架构是对象的拥有者,架构本身无权限,架构包含数据库对象:如表、视图、存储过程和函数等,平时最常见的默认架构dbo.,如果没指定架构默认创建数据库对象都是以dbo.开头,架构的拥有者是数据库用户、数据库角色、应用程序角色。用户创建的架构和角色只能作用于当前库。

理解了这些概念之后接下来就可以实践了,接下来我们测试的都是服务器角色选择public,只测试对数据库权限的控制。

权限分配

新建登入名

新建一个登入名person,只给登入名服务器角色分配public权限,不分配数据库

接下来用person登入实例,person用户无法访问任何数据库,由于我们未给用户分配任何数据库。

给用户分配数据库查看权限

只允许用户查看AdventureWorks2008R2数据库

此时用户可以查询所有对象,但无法修改对象。

给用户查询某个对象的权限

如果觉得给用户查看权限太大了,将da_datareader数据库角色权限回收,你会发现用户可以访问数据库,但是看不到任何对象。

只给用户查看Person.Address表

  1. USE AdventureWorks2008R2;
  2. GRANT SELECT ON OBJECT::Person.Address TO person;
  3. --或者使用
  4. USE AdventureWorks2008R2;
  5. GRANT SELECT ON Person.Address TO RosaQdM;
  6. GO

扩展功能

  1. --以下都是赋予用户对表的dml权限
  1. ---授予用户person对表Person.Address的修改权限
  2. USE AdventureWorks2008R2;
  3. GRANT UPDATE ON Person.Address TO person;
  4. GO
  5.  
  6. ---授予用户person对表Person.Address的插入权限
  7. USE AdventureWorks2008R2;
  8. GRANT INSERT ON Person.Address TO person;
  9. GO
  10.  
  11. ---授予用户person对表Person.Address的删除权限
  12. USE AdventureWorks2008R2;
  13. GRANT DELETE ON Person.Address TO person;

 --授予用户存储过程dbo.prc_errorlog的执行权限
GRANT EXECUTE ON dbo.prc_errorlog TO person

标量函数权限:EXECUTE、REFERENCES。

表值函数权限:DELETE、INSERT、REFERENCES、SELECT、UPDATE。

存储过程权限:EXECUTE。

表权限:DELETE、INSERT、REFERENCES、SELECT、UPDATE。

视图权限:DELETE、INSERT、REFERENCES、SELECT、UPDATE。

授予用户架构的权限

新建数据库角色db_persons

新增架构

数据库-安全性-架构

架构包含数据库对象

创建架构persons表

  1. ---创建架构persons的表
  2. CREATE TABLE Persons.sutdent
  3. (id int not null)

你会发现用户同时有了Persons.sutdent表的查看权限,因为用户是数据库角色db_person的所有者,而db_person又是架构persons的所有者。

创建一些persons架构的视图,存储过程

  1. ---创建视图
  2. USE AdventureWorks2008R2
  3. GO
  4. CREATE VIEW Persons.vwsutdent
  5. AS
  6. SELECT * FROM Persons.sutdent
  7.  
  8. GO
  9. USE AdventureWorks2008R2
  10. GO
  11. ---创建存储过程
  12. CREATE PROCEDURE Persons.SP_sutdent
  13. (@OPTION NVARCHAR(50))
  14. AS
  15. BEGIN
  16. SET NOCOUNT ON
  17. IF @OPTION='Select'
  18. BEGIN
  19. SELECT * FROM Persons.sutdent
  20. END
  21. END

详细的GRANT功能可以查询2008r2连接丛书:

ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_6tsql/html/a760c16a-4d2d-43f2-be81-ae9315f38185.htm

查询权限

  1. ---登入名表
  2. select * from master.sys.syslogins
  3. ---登入名与服务器角色关联表
  4. select * from sys.server_role_members
  5. ---服务器角色表
  6. select * from sys.server_principals
  7. ----查询登入名拥有的服务器角色
  8. select SrvRole = g.name, MemberName = u.name, MemberSID = u.sid
  9. from sys.server_role_members m inner join sys.server_principals g on g.principal_id = m.role_principal_id
  10. inner join sys.server_principals u on u.principal_id = m.member_principal_id
  11.  
  12. ---数据库用户表
  13. select * from sysusers
  14. ---数据库用户表角色关联表
  15. select * from sysmembers
  16. ---数据库角色表
  17. select * from sys.database_principals
  18. ----查询数据库用户拥有的角色
  19. select ta.name as username,tc.name as databaserole from sysusers ta inner join sysmembers tb on ta.uid=tb.memberuid
  20. inner join sys.database_principals tc on tb.groupuid=tc.principal_id

查询登入名与数据库用户之间的关系

  1. --查询当前数据库用户关联的登入名
  2. use AdventureWorks2008R2
  3. select ta.name as loginname,tb.name as databaseusername from master.sys.syslogins ta inner join sysusers tb on ta.sid=tb.sid
  4.  
  5. /*如果将当前数据库还原到另一台服务器实例上,刚好那台服务器上也存在person登入用户,你会发现二者的sid不一样,
  6. 由于sid不一样,所以登入用户不具有当前数据库的访问权限,我们要想办法将二者关联起来。
  7. */
  8. ---关联登入名与数据库用户(将数据库用户的sid刷成登入名的sid
  9. use AdventureWorks2008R2
  10. EXEC sp_change_users_login 'Update_One', 'person', 'person'
  11. Go

查询数据库用户被授予的权限

  1. exec sp_helprotect @username = 'person'

查询person数据库用户权限会发现,数据库用户拥有的权限都是前面使用GRANT赋予的权限,而后面给用户分配的架构对象不在这个里面显示,上面显示的只是被授予的权限,而架构是数据库用户所拥有的权限。

回收权限

如果安全对象是数据库,对应 BACKUP DATABASE、BACKUP LOG、CREATE DATABASE、CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE TABLE 和 CREATE VIEW。

如果安全对象是标量函数,对应 EXECUTE 和 REFERENCES。

如果安全对象是表值函数,对应 DELETE、INSERT、REFERENCES、SELECT 和 UPDATE。

如果安全对象是存储过程,表示 EXECUTE。

如果安全对象是表,对应 DELETE、INSERT、REFERENCES、SELECT 和 UPDATE。

如果安全对象是视图, 对应 DELETE、INSERT、REFERENCES、SELECT 和 UPDATE。

回收dbo.prc_errorlog存储过程的执行权限

  1. USE AdventureWorks2008R2;
  2. REVOKE EXECUTE ON dbo.prc_errorlog FROM person;

回收Person.Address表的查询,修改,删除权限

  1. --回收修改
  2. USE AdventureWorks2008R2;
  3. REVOKE update ON Person.Address FROM person;
  4.  
  5. USE AdventureWorks2008R2;
  6. REVOKE alter ON Person.Address FROM person;
  7.  
  8. --回收删除
  9. USE AdventureWorks2008R2;
  10. REVOKE delete ON Person.Address FROM person;
  11.  
  12. --回收查询
  13. USE AdventureWorks2008R2;
  14. REVOKE select ON Person.Address FROM person;

最后剩下owner为‘.’的是数据库级的权限

最后回收数据库的权限

  1. USE AdventureWorks2008R2;
  2. REVOKE CREATE TABLE FROM person;
  3. GO

  4. CONNECT权限是用户访问数据库的权限,将此权限回收后用户将无法访问数据库
  5. --USE AdventureWorks2008R2;
  6. --REVOKE CONNECT FROM person;
  7. --GO

再执行exec sp_helprotect @username = 'person',就剩下action=connect的数据库访问权限

将权限回收后,数据库用户还剩下架构Persons的权限,如果还需要将该权限回收,只需要用户取消关联对应的db_person数据库角色权限。

详细的revoke权限回收请参考2008r2联机丛书:

ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_6tsql/html/9d31d3e7-0883-45cd-bf0e-f0361bbb0956.htm

补充

针对生产数据库服务器创建一个应用程序访问的用户最常见的是授予用户某个数据库:“查询”、“删除”、“修改”、“插入”、“执行”的权限,用SQL语句实现如下(用户:person,数据库:news):

  1. USE [master]
  2. GO
  3. ---创建登入名
  4. CREATE LOGIN [person] WITH PASSWORD=N'person', DEFAULT_DATABASE=[news], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
  5. GO
  6. USE [news]
  7. GO
  8. ---在指定的数据库下创建和登入名相关联的数据库用户
  9. CREATE USER [person] FOR LOGIN [person]
  10. GO
  11. USE [news]
  12. GO
  13. ---在指定的数据库下授予用户SELECT,DELETE,UPDATE,INSERT,EXECUTE权限。
  14. GRANT SELECT,DELETE,UPDATE,INSERT,EXECUTE TO person;

注意:创建登入名在master数据库下,创建数据库用户和授予数据库权限都是在具体的数据库下操作。

其它相关权限授予

  1. ---授予Profile权限
  2. USE master
  3. GO
  4. GRANT ALTER TRACE TO person
  5. GO
  6. ---授予活动监视器权限
  7. USE master
  8. GO
  9. GRANT VIEW SERVER STATE TO person
  10. GO

总结

所以如果你想对某个用户某个数据库的权限进行细分,你可以通过GRANT来授予具体的对象给用户(当然你也可以revoke回收权限),也可以通过添加某个架构的权限给用户那么用户就拥有该类架构的权限。

用户拥有什么权限取决于角色,而拥有哪些对象取决于拥有包含这些对象的架构,架构的拥有者可以是数据库用户也可以是数据库角色也可以是应用程序角色,明白了这个道理你对权限的管理也就很清晰了。

虽然心有余但是还是无法将整个知识点给讲透,写文章之前虽然把整个框架给整理了,但是在写的过程中发现要写的内容太多了,比如GRANT权限里面就涉及了表、数据库、应用程序角色、函数、证书、角色、架构、存储过程、同义词还有很多;同时表有可以精确到给具体的某个字段的权限,所以太多了,接下来的REVOKE也同样是这么多。本文可以起到一个引领的作用,让你了解有这些功能,了解权限的功能细分;如果有兴趣的朋友可以更深入的去钻研,这篇文章写下来还是挺累的,写完这篇文章看一下时间已经是凌晨二点钟,主要是思维不想被中断所以一口气给写完了,希望能给大家有所帮助。

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

SQL Server 权限管理的更多相关文章

  1. SQL server权限管理和备份实例

    权限设置: 1.创建用户zhangsan,并赋予zhangsan有dbcreator的服务器权限. 2.使用zhangsan登录,测试能否创建数据库. 3.使用sa用户附加myschool数据库,设置 ...

  2. SQL Server 内存管理

    windows memory:  Memory: Cache Bytes 是系统的working set, 也就是系统使用的物理内存数目. 可以观察Windows用了多少物理内存. 1. System ...

  3. 深入浅出:全面理解SQL Server权限体系

    转自IT168  好文转载存档! [IT168 技术]权限两个字,一个权力,一个限制.在软件领域通俗的解释就是哪些人可以对哪些资源做哪些操作.在SQL Server中,"哪些人", ...

  4. 人人都是 DBA(IV)SQL Server 内存管理

    SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...

  5. sql server 警报管理,实时监听数据库动向,运筹帷幄之中

    工作这么多年了,无论是身边的同学还是同事,发现只要搞程序员的都有一个通病---懒.懒到谁都不愿意加班,尤其是"义务"加班.即使大家都不愿意加班,但是很多时候项目赶着上线或者上线之后 ...

  6. 配置SQL Server 2008管理器

    SQl Server 配置管理器(简称为配置管理器)包含了SQL Server 2008服务.SQL Server 2008网络配置和SQL Native Client配置3个工具,供数据库管理人员做 ...

  7. 2.sql server的管理

    sql server的管理:需要安装sql server 2005或者sql server 2008,若要使用sqlserver管理工具进行开发还要安装sql server management st ...

  8. SQL Server遗失管理权限账号密码怎么办?

    假如一个SQL Server实例只允许"SQL身份认证"模式登录数据库,而糟糕的是你忘记了sa的密码(sa出于安全考虑应该被禁用,这里仅仅为了描述问题)或其它具有sysadmin角 ...

  9. SQL Server密码管理的六个危险判断

    当管理SQL Server内在的帐户和密码时,我们很容易认为这一切都相当的安全.但实际上并非如此.在这里,我们列出了一些对于SQL Server密码来说非常危险的判断. 当管理SQL Server内在 ...

随机推荐

  1. WebStorm 2016.2 破解方法

    http://www.jetbrains.com/ 以前的 http://idea.lanyus.com/ 不能激活了 有帖子说的 http://15.idea.lanyus.com/ http:// ...

  2. ASP.Net Core 里是如何把一个普通的 Action 返回类型转换为某种 IActionResult 的

    秘密在于这个类型: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker 在它的 CreateActionResult 方法里会将相关类型 ...

  3. HBase基本shell命令

    HBase基本shell命令 以下shell命令都是经过测试,正常展示,若有不足,还望指点! 1.创建表 create ‘表名称’,‘列族名称1’,‘列族名称1’create 'test_M_01', ...

  4. 3.View绘制分析笔记之onLayout

    上一篇文章我们了解了View的onMeasure,那么今天我们继续来学习Android View绘制三部曲的第二步,onLayout,布局. ViewRootImpl#performLayout pr ...

  5. iOS中的单例

    #import "Singleton.h" @implementation Singleton static Singleton *singleton = nil; + (Sing ...

  6. System中记录体函数命名怪异

    //1019unit System; 中发现记录体函数命名怪异//乍一看,很怪异,其实是结构体里面 的变量后面直接写 函数类型了.不像传统先定义T***Event      = procedure(S ...

  7. iOS 键盘遮挡输入 解决办法

    .初始化及添加通知观察者 - (void)viewDidLoad { [super viewDidLoad]; self.tableView = [[UITableView alloc] initWi ...

  8. 第一天ci框架开发商城2

    ci框架开发商城2 1/28/2016 9:45:52 PM mvc完整案例 mvc完成新闻的增删改查 news控制器news.php class News extends CI_controller ...

  9. JavaScript之基础篇

    标识符 命名要求 以字母.下划线或者$开头: 由字母.下划线.$和数字组成. 关键字和保留字 关键字.保留字不可以作为标识符. 大小写敏感 区分大小写. 基本数据类型 Number 整数 浮点数 特殊 ...

  10. Code Lock[HDU3461]

    Code LockTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...