GRANT SELECT 权限问题

Issue with GRANT SELECT permissions

提问人:Hanna 提问时间:11/8/2023 最后编辑:marc_sHanna 更新时间:11/8/2023 访问量:82

问:

我有一个SQL视图,它是建立在具有不同模式的其他视图之上的:[schemaA].[ViewNameA]

  • [schemaB].[ViewNameB]
  • [schemaC].[ViewNameC]
  • [schemaD].[ViewNameD]

我正在尝试通过以下方式提供对功能帐户“USERXYZ”的访问:[schemaA].[ViewNameA]

GRANT SELECT ON [schemaA].[ViewNameA] to USERXYZ

当我使用此“USERXYZ”帐户登录并尝试运行选择时,出现如下错误:[schemaA].[ViewNameA]

对象“ViewNameB”、数据库“db1”和架构“schemaB”的 SELECT 权限被拒绝。

此帐户 “USERXYZ” 在 db1 上具有角色 “public”。如何在不授予 select to 和其他人的情况下提供访问权限?[schemaA].[ViewNameA][schemaB].[ViewNameB]

我试图管理架构权限 - 但随后用户对架构B下的所有视图都有权限。ALTER AUTHORIZATION

sql-server sql-server-2012 用户权限

评论

0赞 Thom A 11/8/2023
也在数据库中吗?如果是,这两个对象是否属于同一个对象?[schemaA].[ViewNameA]db1USERdb1
0赞 Hanna 11/8/2023
是的,schemaA 也在同一个数据库中。SchemaA 归 USER 所有,SchemaB 归数据库所有者所有。
0赞 Thom A 11/8/2023
那么权限链接将不起作用;需要对对象具有显式权限,或者需要使用其他解决方案,例如已签名的对象。USER
0赞 Hanna 11/8/2023
那么用户不可能看不到分配给架构架构B的视图和表吗?
0赞 Thom A 11/8/2023
我不确定你想在那里问什么。

答:

0赞 Thom A 11/8/2023 #1

这个错误实际上是在告诉你这里的问题。没有权限来自其他对象。从注释中,您声明这些对象位于同一数据库中,但由不同的 s 拥有,因此权限链接将不起作用。因此,为什么不只是从该对象获得权限呢?正如你所演示的那样,你已经知道的语法,但要确认:USERSELECTUSERGRANTUSERSELECT

GRANT SELECT ON [schemaB].[ViewNameB] to USERXYZ;

但是,与此相关的是,不应嵌套视图;这可能(将)出现性能问题。相反,您应该引用需要在 ViewNameA 中引用的对象,而不是引用 ViewNameB。阅读嵌套视图是好的数据库设计吗?可能是值得的。

评论

0赞 Hanna 11/8/2023
感谢您的帮助。我还有最后一个疑问 - 然后 USER 将可以访问 [schemaB] 中的所有数据。[viewNameB],在 [schemaA] 上。[viewNameA] 他只有源视图中的一部分列
0赞 Thom A 11/8/2023
?以上与您问题中的没有什么不同;它将允许对对象进行攻击;它不会对任何特定列使用 A。这包括你的 ;他们可以从 中的所有列中获取数据。我开始觉得你问的问题和你需要问的问题不是一回事。GRANTUSERSELECTDENYSELECTGRANTViewNameA
0赞 Charlieface 11/8/2023
可以说,在不需要的表上授予权限本身就是一个安全问题。最好使视图和表都由这样链接工作,然后授予对所需视图的访问权限。此外,嵌套视图本身并没有问题,只是它们通常包含无法轻松优化的构造,例如聚合或窗口函数,或不必要的连接。SELECTdboUserA
0赞 Hanna 11/8/2023
谢谢@Charlieface!这就是我一直在寻找的解决方案!现在,用户可以从 ViewNameA 中进行选择,而无需 SELECT ViewNameB。
0赞 Thom A 11/8/2023
事实上,我假设这些物品有不同的所有者是有原因的,@Charlieface,所以我没有建议它。当然,如果没有充分的理由,那么我同意拥有同一个所有者将是更好的选择。