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

时间:2010-11-09 14:27:02

标签: sql security tsql sql-server-2008

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

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

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

3 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:3)

如果您的视图与表不同,则必须授予用户对基表的访问权限," AUTHORIZE"表格的所有者如下:

ALTER AUTHORIZATION ON reporting.MyViewName TO dbo

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

答案 2 :(得分:2)

您可以在this forum中找到有用的信息。

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

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。