【问题标题】:Grant SELECT permission on a view, but not on underlying objects授予视图上的 SELECT 权限,但不授予基础对象上的 SELECT 权限
【发布时间】:2011-05-07 06:59:42
【问题描述】:

我经常读到 VIEW 的一个目的是安全性:允许某些用户访问基础表,而其他用户只能访问派生视图。考虑到这一点,我设计了几个向外部用户提供受限数据集的视图。

一切都很好,但实际上这不起作用。在我对视图授予SELECT 权限后,除非我也对所有底层对象授予SELECT,否则用户将无法访问它。存储过程也是如此。最终结果是没有功能的,因为我最终仍然将敏感数据的访问权限授予错误的用户,而且很烦人,因为很容易忘记一个对象并且用户回来抱怨视图“没有工作”。

有没有办法在视图或存储过程上授予SELECT 权限,而不必公开底层对象?

【问题讨论】:

标签: sql security tsql sql-server-2008


【解决方案1】:

拥有视图的同一用户是否也拥有基础表?如果没有,表的所有者需要授予视图所有者权限 WITH GRANT OPTION。如果同一个用户同时拥有表和视图,那么授予视图权限就足够了。

【讨论】:

  • 啊,现在我明白是怎么回事了。我有两个数据库,只有当我在一个数据库中定义的视图中合并对另一个数据库的引用时才会出现问题。它与所有权有关。
  • 通过授予 WITH GRANT 尽管当所有者不同时,我们授予的权限不仅仅是选择 - 这是让它在这种情况下工作的唯一方法(不授予对底层的访问权限)对象)?
【解决方案2】:

this forum 中的信息可能会对您有所帮助。

最后一篇文章详细介绍了为授予视图而不是基础表权限而运行的操作:

CREATE USER [Reports] FOR LOGIN [Reports] WITH DEFAULT_SCHEMA = Reports
CREATE SCHEMA Reports AUTHORIZATION Reports --Auth as Reports was the key piece of information that I had missed.
GO
CREATE ROLE Reporting AUTHORIZATION db_securityadmin
GO
exec sp_addrolemember @rolename = 'Reporting', @membername = 'Reports'
GO
GRANT CREATE VIEW TO Reporting
GRANT CREATE TABLE TO Reporting

GRANT SELECT, VIEW DEFINITION ON [dbo].[zName] TO Reporting;

仅供参考 - 对于存储过程,您应该将 EXEC 授予该过程。

【讨论】:

    【解决方案3】:

    如果您的视图与表的架构不同,则必须授予用户对基表的访问权限,“授权”表的所有者对视图的访问权限,如下所示:

    ALTER AUTHORIZATION ON reporting.MyViewName TO dbo
    

    在上面的示例中,dbo 是拥有reporting.MyViewName 正在访问的表的用户

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-06
      • 2016-12-14
      • 2010-10-20
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      相关资源
      最近更新 更多