授予对视图的SELECT权限,但不授予对底层对象的权限。

28

我经常看到 VIEW 的一个目的是提高安全性:允许某些用户访问基础表,其他用户只能访问派生视图。考虑到这一点,我设计了几个视图,为外部用户提供受限数据集。

听起来很好,但实际上这并不起作用。在我授予一个视图的 SELECT 权限之后,用户无法访问它,除非我也授予所有基础对象的 SELECT 权限。存储过程也是同样的情况。最终结果是无效的,因为我仍然必须将敏感数据的访问权限授予给错误的用户,而且令人烦恼的是容易忘记一个对象,用户会回来抱怨视图"无法工作"。

是否有一种方法可以授予视图或存储过程的 SELECT 权限,而不必同时暴露底层对象?


2
请参见https://dev59.com/QHRC5IYBdhLWcg3wOeaB。 - stuartd
是的,起初我认为那不是我的问题。但事实证明它确实是我的问题 ;) - littlegreen
3个回答

24

拥有视图的用户是否也拥有底层表?如果没有,表的所有者需要授予视图所有者带有GRANT OPTION的权限。如果同一用户拥有表和视图,则在视图上授予权限就应该足够了。


1
啊,现在我明白了发生了什么。我有两个数据库,只有当我在一个数据库中定义视图并将对另一个数据库的引用合并进去时才会出现问题。这与所有权有关。 - littlegreen
通过授予WITH GRANT权限,即使所有者不同,我们也可以授予更多的权限而不仅仅是选择 - 这是在这种情况下让它工作的唯一方法吗(而不授予对底层对象的访问权限)? - rogersillito

3
你可能会发现这个论坛中的信息有所帮助。
最后一个帖子详细说明了授予视图权限但不授予底层表权限的运行细节。
CREATE USER [Reports] FOR LOGIN [Reports] WITH DEFAULT_SCHEMA = Reports
CREATE SCHEMA Reports AUTHORIZATION Reports --Auth as Reports was the key piece of information that I had missed.
GO
CREATE ROLE Reporting AUTHORIZATION db_securityadmin
GO
exec sp_addrolemember @rolename = 'Reporting', @membername = 'Reports'
GO
GRANT CREATE VIEW TO Reporting
GRANT CREATE TABLE TO Reporting

GRANT SELECT, VIEW DEFINITION ON [dbo].[zName] TO Reporting;

顺便提一下 - 对于存储过程,您应该授予EXEC权限来执行该过程。


3
如果您的视图所在模式与表不同,您必须授予用户对基本表的访问权限或者像这样将表的所有者授权给视图:"AUTHORIZE"。
ALTER AUTHORIZATION ON reporting.MyViewName TO dbo

在上面的例子中,dbo 是拥有 reporting.MyViewName 访问的表的用户。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接