简介

在上一篇文章中,我对主体的概念做了全面的阐述。本篇文章接着讲述主体所作用的安全对象以及所对应的权限。

理解安全对象(Securable)

安全对象,是SQL Server 数据库引擎授权系统控制对其进行访问的资源。通俗点说,就是在SQL Server权限体系下控制的对象,因为所有的对象(从服务器,到表,到视图触发器等)都在SQL Server的权限体系控制之下,所以在SQL Server中的任何对象都可以被称为安全对象。

和主体一样,安全对象之间也是有层级,对父层级上的安全对象应用的权限会被其子层级的安全对象所继承。SQL Server中将安全对象分为三个层次,分别为:

  • 服务器层级
  • 数据库层级
  • 构架层级

这三个层级是从上到下包含的,如图1所示:

图1.安全对象层级之间的包含关系

对于SQL Server对于层级的详细划分,可以参看MSDN(http://msdn.microsoft.com/zh-cn/library/ms190401.aspx)。SQL Server中全部的安全对象如图2和图3所示。

图2.服务器层级的安全对象

图3.数据库和构架层级的安全对象

理解权限(Permission)

权限是连接主体和安全对象的纽带。SQL Server 2008中,权限分为权利与限制,分别对应GRANT语句和DENY语句。GRANT表示允许主体对于安全对象做某些操作,DENY表示不允许主体对某些安全对象做某些操作。还有一个REVOKE语句用于收回先前对主体GRANT或DENY的权限。

在设置权限时,尤其要注意权限在安全对象上的继承关系。对于父安全对象上设置的权限,会被自动继承到子安全对象上。主体和安全对象的层级关系如图4所示。

图4.主体和安全对象之间的层级关系

比如,我给予主体CareySon(登录名)对于安全对象CareySon-PC(服务器)的Select(权限),那么CareySon这个主体自动拥有CareySon-PC服务器下所有的数据库中表和视图等子安全对象的SELECT权限。如图5所示。

图5.主体对于安全对象的权限在层级上会继承

此时,主体CareySon可以看到所有数据库极其子安全对象,如图6所示

图6.主体对于安全对象的权限在层级上会继承

使用T-SQL语句进行权限控制

在理解了主体,安全对象和权限的概念之后,使用T-SQL语句进行权限控制就非常简单了。使用GRANT语句进行授予权限,使用DENY语句限制权限,使用REVOKE语句收回之前对于权限的授予或者限制。

GRANT在MSDN的原型为:

GRANT { ALL [ PRIVILEGES ] }
| permission [ ( column [ ,...n ] ) ] [ ,...n ]
[ ON [ class :: ] securable ] TO principal [ ,...n ]
[ WITH GRANT OPTION ] [ AS principal ]

对于GRANT语句的理解就像造句一样 GRANT 某种权限 ON 安全对象类型::安全对象 TO 主体。如果指定了WITH GRANT OPTION,则被授予权限的主体可以授予别的主体同样的权限。

对于DENY语句在MSDN中的原型和GRANT大同小异:

DENY { ALL [ PRIVILEGES ] }
| permission [ ( column [ ,...n ] ) ] [ ,...n ]
[ ON [ class :: ] securable ] TO principal [ ,...n ]
[ CASCADE] [ AS principal ]

值得注意的是CASCADE选项表示拒绝主体对于安全对象的访问权限同时决绝主体授予其他主体对于安全对象的权限。

而REVOKE语句用于收回原来授予或拒绝某个主体对于安全对象的权限。REVOKE在MSDN中的原型如下:

REVOKE [ GRANT OPTION FOR ]
{
[ ALL [ PRIVILEGES ] ]
|
permission [ ( column [ ,...n ] ) ] [ ,...n ]
}
[ ON [ class :: ] securable ]
{ TO | FROM } principal [ ,...n ]
[ CASCADE] [ AS principal ]

一个进行权限控制的例子如下:

grant select--权限
ON Schema::SalesLT--类型::安全对象
to careyson--主体 deny select--权限
ON Schema::SalesLT--类型::安全对象
to careyson--主体 revoke select--权限
ON Schema::SalesLT--类型::安全对象
to careyson--主体

控制权限的时候需要注意如下几点:

  • GRANT会移除主体作用于安全对象上的DENY和REVOKE
  • DENY和REVOKE移出主体作用于安全对象上的GRANT
  • REVOKE会移除主体作用于安全对象上的DENY和GRANT
  • 在高层级上的DENY会覆盖任何子层级的GRANT。比如说,你对于Schema进行Deny,对其包含的表进行Grant,则表的GRANT会被Schema的Deny锁覆盖,如图7所示。

图7.父层级的Deny覆盖子层级的Grant

  • 对于主体作用于高层级的GRANT会被其子Deny所覆盖,还是上面的例子,我对于Schema进行Grant,对于表进行Deny,最后结果还是Deny,如图8所示。

图8.子层级的Deny覆盖父层级的Grant

  • SQL Server不对sysadmin组的成员做任何权限验证操作。换句话说,sysadmin组的成员可以为所欲为

而对于何种的安全对象可以进行何种对应权限的GRANT,REVOKE,DENY,请参看MSDN(http://msdn.microsoft.com/zh-cn/library/ms191291.aspx

总结

本文接着上篇文章讲述了安全对象以及相应的权限。对于权限控制时,理解权限的继承和权限的覆盖会在设置权限时减少很多问题。

sqlserver权限体系(下)的更多相关文章

  1. 理解SQL Server中的权限体系(下)----安全对象和权限

    原文:http://www.cnblogs.com/CareySon/archive/2012/04/12/SQL-Security-SecurableAndPermission.html 在开始阅读 ...

  2. sqlserver权限体系(上)

    简介 权限两个字,一个权力,一个限制.在软件领域通俗的解释就是哪些人可以对哪些资源做哪些操作. 在SQL Server中,”哪些人”,“哪些资源”,”哪些操作”则分别对应SQL Server中的三个对 ...

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

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

  4. 浅谈Oracle权限体系

    对于数据库来讲,安全性的重要程度不言而喻,今天我们就来聊一聊Oracle的权限体系. 1.账户管理 在此之前,先解释下一个容易混淆的概念:模式.所谓模式,指的是用户账户所拥有的一组对象(比如表,索引, ...

  5. 理解SQL Server中的权限体系(上)----主体

    原文:http://www.cnblogs.com/CareySon/archive/2012/04/10/mssql-security-principal.html 简介 权限两个字,一个权力,一个 ...

  6. mysql数据库的权限体系介绍

    一.权限体系简介: MySQL的权限体系在实现上比较简单,相关权限信息主要存储在mysql.User.mysql.db.mysql.Host.mysql_table_priv和mysql.column ...

  7. MySQL数据库权限体系介绍

    本文主要向大家介绍了MySQL数据库权限体系,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一.权限体系简介: MySQL的权限体系在实现上比较简单,相关权限信息主要存储在mys ...

  8. 涂抹mysql笔记-数据库中的权限体系

    涂抹mysql笔记-数据库中的权限体系<>能不能连接,主机名是否匹配.登陆使用的用户名和密码是否正确.mysql验证用户需要检查3项值:用户名.密码和主机来源(user.password. ...

  9. Mysql 之权限体系

    1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVO ...

随机推荐

  1. java-Date、String、Calendar转化

    1.Calendar 转化 String //获取当前时间的具体情况,如年,月,日,week,date,分,秒等 Calendar calendat = Calendar.getInstance(); ...

  2. c# 获取iis地址

    using System;using System.Collections.Generic;using System.DirectoryServices;using System.Linq;using ...

  3. Leetcode Perfect Square

    这道题首先想到的算法是DP.每个perfect square number对应的解都是1.先生成一个n+1长的DP list.对于每个i,可以用dp[i] = min(dp[j] + dp[i-j], ...

  4. 【bzoj3158】 千钧一发

    http://www.lydsy.com/JudgeOnline/problem.php?id=3158 (题目链接) 题意 给出n个装置,每个装置i有一个特征值a[i]和一个能量值b[i],要求选出 ...

  5. 推荐一个学习golang的地址

    链接打开后,文字可以点击! http://yougg.github.io/static/gonote/GolangStudy.html#

  6. gdb简明手册

    如果是在windows环境下,首先要添加环境变量: 新建一个环境变量MinGW_PATH,值为MinGW的运行目录: 然后在系统的Path变量后面加上一句:(每两个变量之间用 ; 分开) ------ ...

  7. bash 操作 sqlite3

    首先,这是个奇怪的需求...但是遇到了.我参考后文链接里的方法,做了自己的. 表是自己手动建的,数据库名字叫 new.db: create table test (sn varchar(), name ...

  8. C#的imagebutton

    常常要用到好看一点的button去做,C#本身不提供imagebutton这个控件. 可以用如下方法: 用imagebox添加image图片.对此image进行事件的处理. 有时候所添加的image过 ...

  9. iOS 关于本地持久化存储的探讨

    目前,用以本地化存储的方式有很多,常用的有以下: 1.临时缓存 先说说临时缓存,临时缓存一般相当于用来管理应用程序中全局需要常用的一些内容.比如当前用户的ID或者当前的定位信息等. 常用的方式就是写一 ...

  10. java.io.IOException: No FileSystem for scheme: hdfs

    在这篇文章中,介绍了如何将Maven依赖的包一起打包进jar包.使用maven-assembly打成jar后,将这个jar提供给其他工程引用的时候,报出如下错误: log4j:WARN No appe ...