Hea*_*ore 5 schema security sql-server view
SQL Server 2008 R2
我们有一个名为“JoeBlogs”的登录和用户,这个用户有它自己的默认schemaJoeBlogs——它Public只能访问数据库。
然后我们SELECT在一个dbo视图上授予它-dbo但是该视图从属于非 dbo模式的基础表中选择数据- 所以我们从视图中选择数据时出现错误,说明对基础表的访问被拒绝。
如何将用户配置为对dbo视图有选择访问权限,但对底层非 dbo表没有访问权限?
这甚至可能吗?
乔丹
在继续解决问题之前,您必须先了解问题。
当您从视图中选择时,SQL Server 系统将检查权限两次:
一次是当您从视图中选择时,另一次是当视图引用基础表时。
显然,如果用户对基础表没有权限,第二次检查就会失败。
微软通过“所有权链”(称为 OC)解决了这个问题。仅当视图的所有者与表的所有者相同时
,OC 才会绕过视图引用表时进行的权限检查。
问题是,OC 完全绕过了权限检查,这意味着它也可以绕过拒绝......
例如,如果“JoeBlogs”拥有权限,他可以创建一个可以访问整个表的新视图。
我建议您在决定采取行动之前先阅读有关所有权链的内容。
create view
话虽如此,第一个直观的解决方案是在与基础表相同的非 dbo模式下创建视图(或者与非 dbo模式由同一用户拥有的模式)。
但是,如果您发现该解决方案风险太大,还有另一个(可能甚至更好)选择:
您始终可以使用带有子句的函数(多语句表值函数)EXECUTE AS:
创建函数语法
执行为子句
此方法将允许您execute当函数属于 时,从函数中进行选择(函数的权限) dbo。子句中指定的用户execute as必须具有基础表的权限。