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

时间:2008-12-15 13:52:15

标签: sql-server

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

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

10 个答案:

答案 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)

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

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

答案 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)

我这样做的方法是向用户授予我不希望它们访问的表的权限。然后,通过仅允许对我视图中的列进行选择权限,来微调SSMS中的选择权限。这样,表上的select子句只限于它们在视图中仍然看到的列。

enter image description here

沙吉

答案 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