我有一个视图,它从不同数据库中的表中选择行。我想授予对视图的select访问权限,但不能直接访问基表。视图有一个where子句限制行数。
我可以将select授予视图而不是基表,还是需要切换到存储过程?我宁愿不采用后一种方式。
答案 0 :(得分:18)
GRANT SELECT ON [viewname] TO [user]
应该这样做。
答案 1 :(得分:15)
当您在其中一条评论中声明相关表位于不同的数据库中时,ownership chaining适用。我怀疑某处链条有断裂 - 检查该链接是否有详细信息。
答案 2 :(得分:13)
我也有这个问题。我使用了上面提到的链接信息,并找到了快速解决方案。如果您有不同的架构,请说测试,并创建用户 utest ,架构测试的所有者以及架构中的视图测试< / strong>您根据架构 dbo 中的表格查看 vTestView ,同时从中进行选择您将收到上述错误 - 无法访问基础对象。这对我来说足以执行语句
ALTER AUTHORIZATION ON test.vTestView TO dbo
;
这意味着我将 vTextView 的所有权从其所属的架构(测试)更改为数据库用户 dbo ,架构的所有者<强> DBO 即可。在此之后,如果没有任何其他权限,用户 utest 将能够从 test.vTestView
访问数据答案 3 :(得分:1)
您可以为视图而不是基表授予权限。这是人们喜欢使用视图的原因之一。
答案 4 :(得分:0)
我在我的一个数据库中尝试了这个。
要使其工作,必须将用户添加到容纳实际数据的数据库中。不需要任何权利,只需访问。
您是否考虑过将视图保留在它引用的数据库中?如果可以实现其好处,可以重新使用所有内容。
答案 5 :(得分:0)
只要有物化视图,您就不必担心所有其他因素。如果空间和刷新时间不是很大,这只会起作用。物化视图非常酷。
答案 6 :(得分:0)
我遇到了类似的问题,我收到了相同的用户错误消息。我觉得通过分享我的错误,我可以解决问题,回答问题,并防止其他人犯同样的错误。我希望用户能够访问4个特定视图,而无需访问其基础表(或者DB中的任何其他内容)。
最初我给了他们&#34; db_denydatareader&#34;的数据库角色成员资格。我认为这会阻止他们从任何表格或视图中选择任何东西(它就像我想的那样),尽管我已经批准了#34;选择&#34;在这4个视图中假设它可以像我预期的那样工作 - 它没有。
正确的方法是简单地不授予他们db_datareader角色,只需授予&#34;选择&#34;在您希望用户能够访问的项目上。上述结果是用户在这4个视图之外无法访问任何内容 - 这些视图区域所基于的表也无法供此用户使用。
答案 7 :(得分:0)
我遇到了这个问题。看来,如果View1使用dbo.table1,则所有者“dbo”需要授予“View1”作为模式“schema1”的一部分的权限。
除非使用的模式不是dbo的一部分,否则这个问题可能不会显而易见,并且“Grant Select to user”的常规解决方案将起作用。
答案 8 :(得分:0)
答案 9 :(得分:0)
Create view Schema1.viewName1 as (select * from plaplapla)
Schema1
具有所有表
Create view Schema2.viewName2 as (select * from schema1.viewName1)
schema2
没有表(只有视图架构)
在这种情况下,您可以在schema2中执行(select * from viewName2
),但是..如果您deleted viewNmae1 from Schema1
,那么ViewName2
将不起作用。
阿曼尼·加马尔(Amani El Gamal) aljamalaisj81@gmail.com