SQL Server自定义角色和默认角色的继承行为是否存在差异?
问题解答
这不是默认角色和自定义角色的权限继承逻辑不一致,核心是你混淆了IS_MEMBER函数的作用、角色成员身份、权限授予三个概念:
- 首先明确
IS_MEMBER('db_datareader')的作用:它仅判断当前用户是否是db_datareader角色的直接/间接成员,和用户是否持有db_datareader对应的权限没有任何关系。 - 你观察到的db_owner成员查询返回true的原因:这是SQL Server固定数据库角色的预定义规则,db_owner角色默认隐式属于所有其他固定数据库角色的成员,因此成员身份检查会返回true。
- 你自定义角色测试返回false的原因:你操作的是给自定义角色授予db_datareader对应的权限,而不是将自定义角色添加为db_datareader的成员。这种场景下用户只是通过自定义角色继承了读权限,并没有形成到db_datareader角色的成员链路,自然成员身份检查返回false。
如果你需要让自定义角色的成员查询IS_MEMBER('db_datareader')返回true,只需要修改角色关联逻辑,不要直接授予权限,而是执行以下语句将自定义角色添加为db_datareader的成员即可,此时成员身份继承逻辑和系统固定角色完全一致:
ALTER ROLE db_datareader ADD MEMBER 你的自定义角色名称;
如果你的需求是判断用户是否实际持有数据库表的读权限,不要用IS_MEMBER做校验,建议使用专门校验权限的HAS_PERMS_BY_NAME函数,它会返回用户从所有路径继承到的实际权限结果。
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

