所有权,CONTROL和TAKE OWNERSHIP

所有权,CONTROL和TAKE OWNERSHIP


今天我意识到早前在讨论对象权限时,并没有对对象的所有权进行深究。因此我将在本文讨论以下主题:对象的所有权、如何变更所有权以及CONTROL权限(SQL SERVER2005新引入)。

所有权(ownership) :这个比较简单。对象所有者(owner)通常是它的创建者,但是我们可以在创建对象时使用AUTHORIZATION子句来指定其他的主体作为对象所有者。对象所有者拥有对象上的所有权限,而且——最重要的是——只要某主体还是对象所有者,我们就不能拒绝该主体在对象上的任何权限。

CONTROL权限 :使用CONTROL权限可以轻易地将对象上的所有的权限(all permissions,译注:所有的权限,而不是所有权)授予其他主体(pricinpal)。CONTROL权限是仅次于所有权外的最好的权限,当然它毕竟和所有权还是有些许区别的。它比所有权主要的差在:被授予CONTROL权限的主体可以在对象的其它权限上被拒绝。比如,我被授予某个表的CONTROL权限,但同时可能被拒绝在表上SELECT权限,这样我就不能SELECT该表了——这样的事情在所有者身上是永远不会发生的,因为所有者不能被“授予”或“拒绝”任何权限。

变更所有权 :我们可以使用ALTER AUTHORIZATION语句来对一个对象变更其所有者。变更对象所有权会在什么该被允许 以及什么不该被允许 这些方面出现许多有趣的场景。一般来说,所有者不能将对象“倒”给不想要的用户;其它用户也不能从对象所有者手中“盗取”对象。为了杜绝此事发生,需要做两方面的检查:一是检查对象控制权能给谁?我们需要核查执行该语句的用户(译注:下文称为权限变更者。它可以是当前所有者,也可以是新所有者,也可以是其他用户。)在新所有者上有什么权限(比如,当权限变更者不是新所者时,如果新所有者是用户或登录名,则需要该所有者的 IMPERSONATE 权限; 如果新所有者是角色,则需要该角色中的成员身份或该角色的 ALTER 权限。等等)。二是检查所有权能否从当前所有者那儿取得,这就要求变更者有对象的TAKE OWNERSHIP权限。
所有权,CONTROL和TAKE OWNERSHIP_第1张图片
 
对象的CONTROL权限的被授予者理所当然能取走对象的所有权,因为CONTROL权限中包括了TAKE OWNERSHIP权限。我们可以通过授予CONTROL权限但是拒绝TAKE OWNERSHIP来杜绝此事的发生。

TAKE OWNERSHIP权限就这样可以被用来授予某人,使其有能力成为对象的所有者或者能够轻易变更对象的所有权。

译注:根据联机帮助,执行ALTER AUTHORIZATION的权限应该是:
需要对实体具有 TAKE OWNERSHIP 权限。如果新所有者不是执行该语句的用户,那么:1) 如果新所有者是用户或登录名,则需要该所有者的 IMPERSONATE 权限;2) 如果新所有者是角色,则需要该角色中的成员身份或该角色的 ALTER 权限;3) 如果新所有者是应用程序角色,则需要该应用程序角色的 ALTER 权限。

变更所有权的负面影响
:变更所有权的一个潜在的让人吃惊的负面影响是该对象上的所有已授予权限将全部丢失。所以一贯的做法是在变更所有权前最好将对象上的所有的权限都生成脚本,这样,如果需要的话,新所有者可以执行这个脚本重新生成对象上权限。

原文地址:
http://blogs.msdn.com/lcris/archive/2009/08/11/basic-sql-server-security-concepts-ownership-control-take-ownership.aspx

你可能感兴趣的:(sql,server,脚本,authorization,permissions)