![](/img/trans.png)
[英]Grant permission for creating stored procedure, view and using Select query
[英]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.