3

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

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

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

对象“Inventory”、数据库“Database”、模式“dbo”的 SELECT 权限被拒绝。

我在想,由于这两个模式都归 dbo 所有,所有权链接将允许查询执行。我似乎能够让它工作的唯一方法是授予 Webuser 对 dbo 的权限,或者将其添加到整个数据库的 db_datareader 角色中。对我来说,如果用户必须具有读取数据库中其他所有内容的能力,这似乎违背了尝试将事物分离到 Webapps 模式中的目的。

那么,我是否忽略了设置中的某些内容?或者,Webuser 必须对这两个模式都具有权限才能使该视图正常工作,这是否正确?

4

2 回答 2

3

埃里克,我认为您正在“跳过”所有权链中的一个步骤......请(另一篇)查看这篇文章:所有权链这是一个片段“所有权链允许通过设置来管理对多个对象(例如多个表)的访问一个对象的权限,例如视图。”

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

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

希望有帮助...

于 2013-10-16T14:02:55.097 回答
0

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

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

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

于 2021-03-10T17:12:49.283 回答