【问题标题】:grant read access on a view but not on it's underlying tables from other databases授予对视图的读取访问权限,但不授予来自其他数据库的基础表的读取权限
【发布时间】:2016-12-14 05:29:13
【问题描述】:

我想授予用户对从另一个数据库连接 2 个表的视图的读取权限。 我不想

  1. 授予他对表所在数据库的权限或将他添加为那里的用户。
  2. 由于安全漏洞,让他成为视图/模式的所有者。
  3. 我不想先创建一个表,或者使用truncate 和一个在触发器上插入数据的存储过程的hack 表的变体。

这可以以某种方式完成吗?也许我错过了一些东西,你们可能知道。

我已经阅读了这些帖子,但它们并没有解决我的问题: Grant SELECT permission on a view, but not on underlying objects

Grant Select on a view not base table when base table is in a different database

https://msdn.microsoft.com/en-us/library/ms188676.aspx

https://dba.stackexchange.com/questions/89632/sql-server-grant-select-access-to-a-user-in-a-view-and-not-in-its-tables

谢谢

编辑: 经过一番研究,我想出的最简单的解决方案是激活数据库上的cross database ownership chainingoption,我将在其中放置视图并向用户授予读取权限。这可能与我试图避免的第二点形成对比。这是个好主意吗?

【问题讨论】:

  • 我在实践中也遇到了同样的情况。我不知道您将如何将数据从视图传递给用户 - 我们使用了网页,该网页在 SQL Server 登录下连接到数据库,该网页只有对视图和所有相关表的读取访问权限。查看页面的访问权限由要求 Windows 身份验证 (AD) 的 IIS 服务器控制。
  • 用户将使用excel直接连接到数据库。你知道不使用任何网页或除sql server management studio之外的其他软件的方法吗?
  • 不幸的是,起初我认为 Excel 是一种交付数据的工具,但还没有找到任何足够安全的方法来实现它。这里决定通过我一直在运行的 IIS 服务器提供它。我认为您可以查看 SSRS,我个人没有使用它,但我的同事使用它 - 它可能是您问题的解决方案。您可以制作用户可以查看的报告,但他们无法通过此报告获取/更改数据。
  • CM2K 一种解决方法是通过链接服务器将视图放在单独的服务器上,并授予他们对该视图的 SELECT 权限。
  • 您在枚举列表中的第一点使这变得困难。为了检查权限,数据库需要一个主体来检查。如果您不将用户添加到目标数据库中,则无需检查。

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


【解决方案1】:

让他们登录到同一服务器上的另一个数据库,并且只包含您的单个视图,该视图指向您的安全数据库。除了包含视图的数据库之外,不要给该登录名任何访问权限,并且只能读取该单个视图的访问权限。显然,您必须完全限定您的表名(例如,from SourceDB.dbo.SomeSecretTable)。

【讨论】:

  • 感谢您的回答,但这正是我所做的,用户无法访问视图,因为他缺乏对表所在的数据库的权限。表名是完全限定的。请看我的编辑。我认为如果我也启用cross database ownership chaining,这将起作用。但这是个好主意吗?
  • 嗯。 Microsoft 建议不要使用链接 (msdn.microsoft.com/en-us/library/bb669059.aspx)。告诉我:他们知道另一个秘密数据库的数据库名称吗?如果他们不这样做,他们将无法知道他们对它具有选择访问权限,因此通过授予相同的登录选择访问秘密数据库,您不会丢失任何东西。这样可以解决所有权链接问题,并且仍然可以完成您想要做的事情?
  • 我很确定有些人可能知道数据库的名称。所以这不是一个好方法
  • stackoverflow.com/questions/368414 上查看 Kosmo 的答案,看看是否可以解决问题?它极大地简化了事情,因为您将为该用户创建一个单独的模式,然后在该模式中创建视图,而不是授予他们对 dbo 模式的视图访问权限。还是值得一试?
  • 我会试试的。谢谢。这篇文章在 wiki 中慢慢转变 :)
【解决方案2】:

我最终做了什么:

  1. 创建一个活动目录组。
  2. 将用户添加到 AD 组。
  3. 为源数据库和目标数据库映射的 AD 组创建登录。
  4. 在目标数据库上添加用户,并仅授予他请求视图的权限。
  5. (可选)在所有数据库上添加组以拒绝选择。

如果没有 AD 组,我的原始问题无法找到解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多