数据库层面与逐表拒绝用户SELECT权限有何区别,效果是否一致
数据库层面拒绝SELECT权限与逐表拒绝的核心差异
- 作用范围继承性不同:数据库级DENY SELECT会自动应用到当前及未来新增的所有支持SELECT操作的对象,逐表DENY仅对执行脚本时已存在的用户表生效,后续新建的表不会自动被限制。
- 覆盖对象类型不同:数据库级DENY SELECT覆盖所有可执行SELECT操作的对象,包括用户表、系统表、视图、表值函数、存储过程返回的结果集查询权限等;逐表DENY仅限制用户表的查询权限,视图、函数等其他对象未被单独配置的情况下,用户仍可正常查询。
- 后续权限调整成本不同:如果后续需要给用户放开某张表的查询权限,逐表DENY的场景只要单独REVOKE对应单表的DENY规则即可;而数据库级DENY的场景下,单独给单表授予SELECT权限不会生效,必须先REVOKE数据库级的DENY SELECT,再重新配置细粒度权限,操作成本高很多。
两个脚本的执行效果对比
两个脚本执行后不会得到相同效果,核心差异如下:
- 脚本1使用未公开系统存储过程
sp_msforeachtable遍历当前数据库的所有用户表,给每张表单独为UserA添加SELECT权限的DENY规则。执行后UserA仅无法查询执行脚本时已存在的用户表,仍可查询视图、表值函数、后续新建的用户表,以及有权限的系统表。 - 脚本2直接在当前数据库层级为UserA添加SELECT权限的DENY规则。执行后UserA无法查询该数据库内任何支持SELECT操作的对象,包括已有的、后续新建的表/视图/函数等,哪怕后续单独为某张表给UserA开放SELECT权限也会被数据库级的DENY规则覆盖,无法生效。
内容的提问来源于stack exchange,提问作者Y Chan
相关产品推荐
相关产品推荐

