繁体   English   中英

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

[英]Grant SELECT permission on a view, but not on underlying objects

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

一切都很好,但实际上这不起作用。 在我对视图授予SELECT权限后,除非我在所有底层对象上授予SELECT ,否则用户无法访问它。 存储过程的相同故事。 最终结果是非功能性的,因为我最终仍然允许向错误的用户授予对敏感数据的访问权限,并且令人讨厌,因为很容易忘记一个对象并且用户回过头来抱怨该视图“不工作”。

有没有办法在视图或存储过程上授予SELECT权限,而不必公开底层对象?

拥有该视图的同一用户是否也拥有基础表? 如果不是,表的所有者需要授予视图所有者权限WITH GRANT OPTION。 如果同一用户拥有表和视图,则授予视图权限就足够了。

如果您在与表不同的模式中拥有视图,则必须授予用户对基表的访问权限,将表的所有者“AUTHORIZE”赋予视图,如下所示:

ALTER AUTHORIZATION ON reporting.MyViewName TO dbo

在上面的例子dbo是用户拥有该表reporting.MyViewName正在访问

您可能会发现此论坛中的信息很有帮助。

最后一篇文章详细介绍了为视图授予权限而不是基础表的运行内容:

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM