提问人:Hanna 提问时间:11/8/2023 最后编辑:marc_sHanna 更新时间:11/8/2023 访问量:82
GRANT SELECT 权限问题
Issue with GRANT SELECT permissions
问:
我有一个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
答:
0赞
Thom A
11/8/2023
#1
这个错误实际上是在告诉你这里的问题。没有权限来自其他对象。从注释中,您声明这些对象位于同一数据库中,但由不同的 s 拥有,因此权限链接将不起作用。因此,为什么不只是从该对象获得权限呢?正如你所演示的那样,你已经知道的语法,但要确认:USER
SELECT
USER
GRANT
USER
SELECT
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。这包括你的 ;他们可以从 中的所有列中获取数据。我开始觉得你问的问题和你需要问的问题不是一回事。GRANT
USER
SELECT
DENY
SELECT
GRANT
ViewNameA
0赞
Charlieface
11/8/2023
可以说,在不需要的表上授予权限本身就是一个安全问题。最好使视图和表都由这样链接工作,然后授予对所需视图的访问权限。此外,嵌套视图本身并没有问题,只是它们通常包含无法轻松优化的构造,例如聚合或窗口函数,或不必要的连接。SELECT
dbo
UserA
0赞
Hanna
11/8/2023
谢谢@Charlieface!这就是我一直在寻找的解决方案!现在,用户可以从 ViewNameA 中进行选择,而无需 SELECT ViewNameB。
0赞
Thom A
11/8/2023
事实上,我假设这些物品有不同的所有者是有原因的,@Charlieface,所以我没有建议它。当然,如果没有充分的理由,那么我同意拥有同一个所有者将是更好的选择。
评论
[schemaA].[ViewNameA]
db1
USER
db1
USER