所有权链接在同一数据库中的两个模式之间不起作用

时间:2013-10-15 14:39:15

标签: sql sql-server sql-server-2008 database-schema

我在SQL Server 2008 R2上有一个数据库,它有两个模式,默认dbo和另一个名为Webapps的模式,两个模式都归dbo所有。

我在Webapps架构(Webapps.getInventory)中创建了一个视图,它只是从dbo.Inventory中进行简单的选择。然后我创建了一个名为Webuser的用户,该用户对Webapps架构具有SELECT权限。

Webuser可以登录并查看Webapps.getInventory视图,但是当它尝试从中进行选择时会出现此错误:

  

对象'Inventory',数据库'Database',schema'dbo'上的SELECT权限被拒绝。

我在想,既然两个模式都是dbo所有,所有权链接都允许查询执行。我似乎能够使其工作的唯一方法是在dbo上授予Webuser权限,或将其添加到整个数据库的db_datareader角色。对我而言,如果用户必须具有对数据库中其他所有内容的读取能力,那么似乎无法将事情分解为Web应用程序架构。

所以,我在设置中忽略了什么?或者,为了使这个视图有效,Webuser必须拥有两个模式的权限才是正确的吗?

2 个答案:

答案 0 :(得分:2)

Eric我认为你正在“跳过”所有权链中的一步...... 有(另一个)看看这篇文章:Ownership Chains这是一个片段“所有权链接通过设置一个对象(如视图)的权限,可以管理对多个对象(如多个表)的访问。”

链接并不关心两个模式是否由dbo拥有,而是每个登录/用户对对象具有适当的权限。因此,如果您拥有dbo所拥有的表,该表包含在您已授予对webapps架构的select访问权限的视图中,则具有访问权限的用户应该可以访问该表。所有权链的检查不比他们可以根据视图选择的事实更深入,不需要评估他们是否可以针对该表进行选择。

长话短说,如果你在webapps具有选择权限的视图中包装dbo.table,那么你应该很好。

希望有帮助...

答案 1 :(得分:0)

跨架构所有权链接可能会中断的另一个原因是架构所有者最近发生了更改,例如为了使用所有权链接,专门将它们设置为同一所有者。 您可能需要删除并重新创建视图(并重新添加权限),然后它才能起作用。

SQL Server 缓存视图的各种属性,我看到这种缓存似乎导致 SQL Server 没有意识到该视图访问的对象在那时实际上确实具有相同的所有者。它对视图访问的对象给出了“权限被拒绝”错误。删除并重新创建视图解决了问题。重新启动数据库服务器也可能修复了它,但当时这不是一个选项。

SQL Server 还允许单个对象具有不同于架构所有者的特定所有者,并且我确认视图和访问的对象都没有单独的所有者集。我在 SQL Server 2012 中看到了这一点。不确定它是否已在较新版本中修复。