首页 文章

当基表位于不同的数据库中时,在视图而非基表上授予选择

提问于
浏览
16

我有一个视图,它从不同数据库中的表中选择行 . 我想授予对视图的select访问权限,但不能直接访问基表 . 视图有一个where子句限制行数 .

我可以将select授予视图而不是基表,还是需要切换到存储过程?我宁愿不以后一种方式去做 .

8 回答

  • 0

    我在我的一个数据库中试过这个 .

    为了使其工作,必须将用户添加到容纳实际数据的数据库中 . 不需要任何权利,只需要访问权限 .

    您是否考虑过将视图保留在它引用的数据库中?如果可以获得其好处,那么可用性和所有可用性 .

  • 0

    只要有物化视图,您就不必担心所有其他因素 . 如果空间和刷新时间不是很大,这只会起作用 . 物化视图非常酷 .

  • 14

    当您在其中一条评论中声明所讨论的表位于不同的数据库中时,则适用ownership chaining . 我怀疑某处链条有断裂 - 检查该链接是否有详细信息 .

  • 1
    GRANT SELECT ON [viewname] TO [user]
    

    应该这样做 .

  • 0

    我也有这个问题 . 我使用了上面提到的链接信息,并找到了快速解决方案 . 如果您有不同的架构,请说 test ,并创建用户 utest ,架构 test 的所有者以及架构 test 中的视图,您可以根据架构 dbo 中的表查看 vTestView ,同时从中进行选择,您将收到上述错误 - 否访问基础对象 . 这对我来说已经足够执行声明了

    ALTER AUTHORIZATION ON test.vTestView TO dbo ;

    这意味着我将 vTextView 的所有权从它所属的架构( test )更改为架构 dbo 的所有者数据库用户 dbo . 之后,如果没有任何其他权限,用户 utest 将能够从 test.vTestView 访问数据

  • 0

    您可以为视图而不是基表授予权限 . 这是人们喜欢使用视图的原因之一 .

    看看这里:GRANT Object Permissions (Transact-SQL)

  • 11

    我有一个类似的问题,我收到了相同的用户错误信息 . 我觉得通过分享我的错误,我可以解决问题,回答问题,并防止其他人犯同样的错误 .
    我希望用户能够访问4个特定视图,而无需访问其基础表(或者DB中的任何其他内容) .
    最初,我给了他们"db_denydatareader"的数据库角色成员资格,认为这会阻止他们从任何表或视图中选择任何东西(就像我想的那样),尽管我在这4个视图中授予了"select",假设它可以像我一样工作意图 - 它没有 .
    正确的方法是不要授予他们db_datareader角色,只需在您希望用户能够访问的项目上授予"select" . 上述结果是用户在这4个视图之外无法访问任何内容 - 这些视图区域所基于的表也不可用于此用户 .

  • 15

    我有这个问题 . 看来,如果View1使用dbo.table1,则所有者“dbo”需要授予“View1”作为模式“schema1”的一部分的权限 .

    除非使用的模式不是dbo的一部分,否则这个问题可能不会变得明显,并且“Grant Select to user”的常规解决方案将起作用 .

相关问题