这些是SQL Server 2005中的新的权限类型:
· CONTROL。 授予所有者想要的权限,这些权限可以有效地对这个对象授予所有定义的权限,并且所有对象在它的范围内,包括授予其它受权人任何权限的能力。CONTROL SERVER授予等价于sysadmin的权限。
· ALTER。授予权限来修改可得到的对象的任何属性,除了修改所属关系。固定地授予权限给相同范围内的ALTER、CREATE或 DROP 可得到的对象。例如,授予一个数据库上的ALTER权限,包括修改它的表。
· ALTER ANY <可得到的对象>。 授予权限以修改可得到的指定类型的对象。例如,授予ALTER ANY ASSEMBLY允许修改数据库中的任何.NET 集合,而在服务器级别授予ALTER ANY LOGIN 使得用户修改任何在服务器上的登陆。
· IMPERSONATE ON <登陆或用户>。 授予权限来模拟特定的用户或登陆。你在本篇文章的后面可以看到,这个权限对于为存储过程转换执行上下文是很必要的。你在一个批处理中进行模拟也需要这个权限。
· TAKE OWNERSHIP。 授予权限给受权人以使用可得到的所有权,使用ALTER AUTHORIZATION语句。
SQL Server 2008仍然使用类似的GRANT、DENY和REVOKE scheme来指派或拒绝给一个主体授予对一个可得到的对象的权限。现在ANT 语句涵盖了所有新的权限选项,例如授予的范围和是否主体可以授予这个权限给其它主体。SQL Server 不允许数据库交叉权限。为了授予这样的权限,你要在每一个数据库中创建一个复制的用户,并单独的给每一个数据库用户指派这个权限。
如同SQL Server 之前的版本一样,激活一个应用程序角色会在这个角色活动的期限内挂起其它的权限。然而,在SQL Server 2008和SQL Server 2005中,你具有卸载应用程序角色的能力。SQL Server 2000和之后版本的另一个不同之处是,当激活一个应用程序角色时,这个角色还会挂起任何服务器权限,包括public。例如,如果你授予VIEW ANY DEFINITION给public,应用程序不会受益于它。这是当在一个应用程序角色上下文中访问服务器级别的元数据时值得注意的。
注意 这个新的首选的应用程序角色选择将使用代码模块中的执行上下文。要获得更多的信息,请查看本文中的执行上下文一节。
授予一个特殊的权限可以传递其它暗含的权限。例如在一个schema 上的ALTER 权限暗含了更细粒度和较低级别的权限。图5显示了ALTER SCHEMA暗含的权限。

当你考虑可用的主体的数目和类型、服务器和一个典型的数据库中的可得到的对象的数目、可用的权限和隐藏的以及暗含的权限的数目时,“在SQL Server 2008中的细粒度权限是怎样的”就立刻清楚了。现在创建一个数据库要求更细致地分析它的安全需求和谨慎地控制在所有对象上的权限。然而,这个分析是很值得的,在SQL Server 2008中使用这些功能会使得数据库更安全。
4.4 元数据安全
细粒度权限scheme 的一个好处是SQL Server保护元数据和数据。在SQL Server 2005之前,一个用户对数据库的任何访问都会看到数据库中的所有对象的元数据,无论这个用户是否可以访问其中的数据或执行存储过程。
SQL Server 2008检查主体在数据库中具有的权限,并仅当这个主体是所有人或他具有这个对象的一些权限时才可以显示这个对象的元数据。还有一个VIEW DEFINITION 权限可以授予查看元数据信息的权限,它甚至不需要这个对象的其它权限。
这个保护扩展到因用户没有权限所做的访问或更新对象的操作所返回的错误信息。不只是承认确实有一个表叫做Address ,还给攻击者一个信息说她被跟踪了,SQL Server返回一个具有选择可能性的错误信息。例如,如果一个用户没有对数据库中的任何对象的权限,他试图删除Address表,那么SQL Server 会显示下面的错误信息:
Msg 3701, Level 14, State 20, Line 1
Cannot drop the table 'Address', because it does not exist or you do not have
在这种方式下,攻击者不能确定一个Address表是否真的存在。然而,调试这个问题的人仍然只需要探究有限的可能性。