【转】理解SQL Server的安全对象和权限

理解安全对象(Securable)

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

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

  •     服务器层级

  •     数据库层级

  •     构架层级

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

    【转】理解SQL Server的安全对象和权限

 

    对于SQL Server对于层级的详细划分,可以参看MSDN。SQL Server中全部的安全对象如图2和图3所示。

    【转】理解SQL Server的安全对象和权限

    

    【转】理解SQL Server的安全对象和权限

 

理解权限(Permission)

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

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

【转】理解SQL Server的安全对象和权限

   

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

【转】理解SQL Server的安全对象和权限

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

    【转】理解SQL Server的安全对象和权限

 

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

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

    GRANT在MSDN的原型为:

1

2

3

4

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大同小异:

1

2

3

4

DENY { ALL PRIVILEGES ] }

      | permission [ ( column [ ,...n ] ) ] [ ,...n ]

      ON [ class :: ] securable ] TO principal [ ,...n ] 

      CASCADE] [ AS principal ]

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

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

1

2

3

4

5

6

7

8

9

REVOKE GRANT OPTION FOR ]

      

        ALL PRIVILEGES ] ]

        |

                permission [ ( column [ ,...n ] ) ] [ ,...n ]

      }

      ON [ class :: ] securable ] 

      TO FROM } principal [ ,...n ] 

      CASCADE] [ AS principal ]

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

1

2

3

4

5

6

7

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所示。

   【转】理解SQL Server的安全对象和权限

 

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

    【转】理解SQL Server的安全对象和权限

 

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

 

    而对于何种的安全对象可以进行何种对应权限的GRANT,REVOKE,DENY,请参看MSDN。

 

总结

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


作者:FFIVE
链接:https://www.imooc.com/article/28697
来源:慕课网