找回密码
 注册

QQ登录

只需一步,快速开始

搜索

SQL SERVER 权限设置

[复制链接]
山海致远 发表于 2014-11-11 00:39:31 | 显示全部楼层 |阅读模式
概述      对数据库系统而言,保证数据的安全性永远都是最重要的问题之一。一个好的数据库环境,必须明确每个用户的职责,并分配其对应的权限。同时出现问题了也可以找到根源。
你是否会有这样的需求:
  • 给某个用户查询所有数据库的权限
  • 给某个用户只有备份数据库的权限
  • 给一个用户只有指定数据库的权限
  • 给一个用户只有某个表的权限
  • 给一个用户只有查看某些对象(例如:视图)的权限
  • 给一个用户只有执行一些存储过程的权限

目录
  • 元素
    • 登入名
    • 角色
    • 用户
    • 架构
  • 权限分配
    • 新建登入名
    • 给用户分配数据库查看权限
    • 给用户查询某个对象的权限
    • 授予用户架构的权限
  • 查询权限
  • 回收权限
  • 总结
元素文章可能会有些枯燥,还望耐心,相信应该有你想要的。
登入名
只有拥有了登入名才能访问实例(sql server).
角色
角色是一类权限的组合。
  • 数据库角色的拥有者可以是用户也可以是数据库角色本身,管理员可以创建数据库角色,也可以勉强将数据库角色理解为一组相同权限的用户,为什么这么说呢,因为数据库角色和数据库用户不允许存在同名。 071505087377384.png
注意:不要将用户创建的数据库角色添加到固定的服务器数据库角色当中去,否则将导致固定的数据库角色的权限升级。
  • 服务器角色的拥有者只有登入名,服务器角色是固定的,用户无法创建服务器角色。 071507313468050.png
注意:一般不建议给用户直接分配服务器角色,因为服务器角色是全局的,也就是说你拥有了服务器级别的权限,一般建议给用户分配数据库,然后给对应的数据库分配数据库角色权限。
用户
      用户是数据库级的概念,数据库用户必须绑定具体的登入名,你也可以在新建登入名的时候绑定此登入名拥有的数据库,当你绑定登入名数据库后,数据库默认就创建了此登入名同名的数据库用户,登入名与数据库用户之间就存在关联关系,数据库用户是架构和数据库角色的拥有者,即你可以将某个架构分配给用户那么该用户就拥有了该架构所包含的对象,你也可以将某个数据库角色分配给用户,此用户就拥有该数据库角色的权限。
架构
      架构是对象的拥有者,架构本身无权限,架构包含数据库对象:如表、视图、存储过程和函数等,平时最常见的默认架构dbo.,如果没指定架构默认创建数据库对象都是以dbo.开头,架构的拥有者是数据库用户、数据库角色、应用程序角色。用户创建的架构和角色只能作用于当前库。

理解了这些概念之后接下来就可以实践了,接下来我们测试的都是服务器角色选择public,只测试对数据库权限的控制。
权限分配新建登入名
新建一个登入名person,只给登入名服务器角色分配public权限,不分配数据库
071530522991852.png 071531005035945.png
接下来用person登入实例,person用户无法访问任何数据库,由于我们未给用户分配任何数据库。
071542574872269.png
给用户分配数据库查看权限
只允许用户查看AdventureWorks2008R2数据库
071614168786171.png
此时用户可以查询所有对象,但无法修改对象。
给用户查询某个对象的权限      如果觉得给用户查看权限太大了,将da_datareader数据库角色权限回收,你会发现用户可以访问数据库,但是看不到任何对象。
    071624410652680.png
只给用户查看Person.Address表
USE AdventureWorks2008R2;GRANT SELECT ON OBJECT::Person.Address TO person;--或者使用USE AdventureWorks2008R2;GRANT SELECT ON Person.Address TO RosaQdM;GO
071636249249512.png
扩展功能
--以下都是赋予用户对表的dml权限[url=] copycode.gif [/url]
---授予用户person对表Person.Address的修改权限USE AdventureWorks2008R2;GRANT UPDATE ON Person.Address TO person;GO---授予用户person对表Person.Address的插入权限USE AdventureWorks2008R2;GRANT INSERT ON Person.Address TO person;GO---授予用户person对表Person.Address的删除权限USE AdventureWorks2008R2;GRANT DELETE ON Person.Address TO person;

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

[url=][/url]
标量函数权限:EXECUTE、REFERENCES。
表值函数权限:DELETE、INSERT、REFERENCES、SELECT、UPDATE。
存储过程权限:EXECUTE。
表权限:DELETE、INSERT、REFERENCES、SELECT、UPDATE。
视图权限:DELETE、INSERT、REFERENCES、SELECT、UPDATE。
[url=][/url]

授予用户架构的权限
新建数据库角色db_persons
071750216591898.png
新增架构
数据库-安全性-架构
071754576129392.png
架构包含数据库对象
创建架构persons表
---创建架构persons的表CREATE TABLE Persons.sutdent(id int not null)
你会发现用户同时有了Persons.sutdent表的查看权限,因为用户是数据库角色db_person的所有者,而db_person又是架构persons的所有者。
071816101285532.png
创建一些persons架构的视图,存储过程
[url=][/url]
---创建视图USE AdventureWorks2008R2GOCREATE VIEW Persons.vwsutdentASSELECT * FROM Persons.sutdentGOUSE AdventureWorks2008R2GO---创建存储过程CREATE PROCEDURE Persons.SP_sutdent(@OPTION NVARCHAR(50))ASBEGIN    SET NOCOUNT ON    IF @OPTION='Select'    BEGIN    SELECT * FROM Persons.sutdent    ENDEND [url=][/url]

071829405495244.png

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-3-29 07:46

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表