首页  ·  知识 ·  数据库
所有权链接
网友    MS-SQL  编辑:dezai   图片来源:网络
如果在同一DB下同一SCHEMA下并为同一SCHEMA所有者情况下,如果给用户赋予一个存储过程 “执行权限”,而该用户没有对 对象拥有读、写、删 的任何权限。

最近发生的一个业务中牵扯到了所有权链接,于是把这几天学到的和实践的结果写了下来。希望能帮助与我类似的朋友
--所有权链接
是指一个对象调用另一个对象(可以是跨库跨架构)。
1、
如果在同一DB下同一SCHEMA下并为同一SCHEMA所有者情况下,如果给用户赋予一个存储过程 “执行权限”,而该用户没有对 对象拥有读、写、删  的任何权限。但是由于其有了 对存储过程 执行权限,那么该用户就可以通过存储过程 对表对象 执行 “INSERT\ UPDATE \ DELETE”了。如果存储过程中的SQL语句如果是动态的话,SQL 服务器就会提示没有对 表对象 执行 “INSERT\ UPDATE \ DELETE”权限。
那是因为调用动态SQL语句时,所有权链接就会自动终止,因为SQLSERVER在执行 EXEC() 和 sp_executesql 时,会在单独的批里处理该语句,即不是和存储过程在一个批里处理。SQL 启动第二个批之后,所有权链接将自动中断;相反,如果SQL语句不是动态的,在执行存储过程是SQL 服务器将终止 这种对表对象上的 权限验证。

2、如果架构的所有者相同,那么所有权链接是可以跨库的。例如A架构和B架构的所有者相同,那么A架构中的存储过程就可以引用B架构中的表等对象(对表对象没有任何权限)。因为SQL 认为一个对象引用另一个对象,并且他们在相同的架构里或者共享相同的所有者的架构里,就应该这样做,并建立所有权链接。所有权链接总是发生在数据库内,没有任何选项可以关闭所有权链接。

3、架构的所有权链接最终是被映射到登录名级别上。

可以通过 select * from fn_my_permissions('object_name','object_type')---来查看所具有的权限。

可以使用 上下文切换临时模拟用户名或登录名 execute as user='user_name' 或 execute as login ='login_name' 来模拟一个用户或登录名(即获取模拟用户或登录名的权限)

执行上下文切换时,必须为被模拟的用户执行模拟权限。例如 GRANT IMPERSONATE ON USER ::dbo to user_name.--给user_name用户授予模拟dbo账户的权限

存储过程一旦执行完毕。上下文切换 就消失。user_name就恢复到了它自己的权限了。


使用 revert 将用户的权限恢复为用户最初也就是之前的安全上下文。需要注意的是,revert一次只能恢复一次上下文切换。如果进行了多次上下文切换,则需要执行多次revert

本文作者:网友 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读