我经常读到VIEW的一个目的是安全性:允许一些用户访问底层表,而其他用户只能访问派生视图。考虑到这一点,我设计了几个视图,为外部用户提供受限制的数据集。
一切都很好,但实际上这不起作用。在我对视图授予SELECT
权限后,除非我对所有基础对象授予SELECT
,否则用户无法访问它。存储过程的相同故事。最终结果是非功能性的,因为我最终仍然允许对错误用户访问敏感数据,并且令人讨厌,因为很容易忘记一个对象并且用户回来抱怨视图“不工作。”
是否有办法在视图或存储过程上授予SELECT
权限,而不必公开底层对象?
答案 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。