Server 2008 R2
我们有一个名为" JoeBlogs“的登录用户,这个用户拥有自己的默认schema of JoeBlogs-它只有Public访问数据库。
然后,我们在一个SELECT视图上授予它dbo --然而,dbo视图从属于非dbo的底层表中选择数据,因此我们从视图中选择一个错误,即拒绝对底层表进行访问。
如何将用户配置为拥有对dbo视图的select访问权,而不是底层的非dbo表?
这有可能吗?
若尔登
发布于 2012-10-22 13:57:12
在着手解决问题之前,你必须了解这个问题。
当您从视图中选择时,Server系统将检查权限两次:
从视图中选择一次,当视图引用基础表时一次。
显然,如果用户对基础表没有权限,则第二次检查将失败。
微软已经用“所有权链”(称为OC)解决了这个问题。
OC将绕过视图引用表时所做的权限检查,
只有当视图的所有者与表的所有者相同时。
问题是,OC完全绕过了许可检查,这意味着它也可以绕过拒绝.
例如,如果"JoeBlogs“具有create view权限,则他可以创建一个可以访问整个表的新视图。
我建议你在决定你的行动之前先读一读关于所有权的链接。
详细示例,使用存储过程而不是视图
尽管如此,第一个直观的解决方案将是在与基础表相同的非dbo模式下创建视图(或与非dbo模式相同的用户所拥有的模式)。
但是,如果您发现该解决方案风险太大,还有另一种(甚至更好的)选择:
可以始终使用带有EXECUTE AS子句的函数(多语句表值函数):
创建函数语法
执行为子句
此方法将允许您在函数属于dbo时从函数(函数的execute权限)中进行选择。execute as子句中指定的用户必须对基础表具有权限。
https://dba.stackexchange.com/questions/27229
复制相似问题