IS_ROLEMEMBER错误地为数据库角色成员返回0?

l33*_*33t 8 sql-server ssms

运行本地实例SQL Server 2012.

我创建了一个自定义角色:

CREATE ROLE [my_user] AUTHORIZATION [dbo]
Run Code Online (Sandbox Code Playgroud)

对于我的所有用户(本地Windows用户和SQL用户),我已为我的数据库指定了此角色(在该User Mappings设置下).因此,以下查询应返回1:

SELECT IS_ROLEMEMBER('my_user')
Run Code Online (Sandbox Code Playgroud)

对于我经过Windows身份验证的用户,它确实返回1,但是一旦我以SQL用户身份登录,它就会返回0.我已经三次检查过SQL用户确实有这个角色.我在这里错过了什么?

更新

进行了一些更多的测试.这当然是奇怪的行为.我执行了以下步骤:

  1. 在我的本地SQL Servertest用用户创建了一个数据库sa.角色my_user补充.
  2. 身份登录saManagement Studio,并加入MYDOMAIN\MyUser到这个角色.
  3. 使用Windows身份验证重新登录并执行IS_ROLEMEMBER('my_user').返回0.
  4. 使用sa(指定用户名)和Windows用户尝试查询.同样的问题.
  5. 尝试重新启动SQL Server,以防万一.

这毫无意义!如果我右键单击该角色,我可以看到我的Windows用户确实是它的成员.该IS_ROLEMEMBER功能是有缺陷的!当我运行以下查询时,它显示我的用户确实是数据库角色的成员:

SELECT
    USER_NAME(memberuid), USER_NAME(groupuid)
FROM
    sys.sysmembers
WHERE
    USER_NAME(groupuid) = 'my_user'
Run Code Online (Sandbox Code Playgroud)

这也显示了我的会员资格:

select r.name as role_name, m.name as member_name from sys.database_role_members rm 
inner join sys.database_principals r on rm.role_principal_id = r.principal_id
inner join sys.database_principals m on rm.member_principal_id = m.principal_id
Run Code Online (Sandbox Code Playgroud)

一些其他信息:

  • 我在域名上,但目前已断开连接.我连接的时候也看到过这个问题.
  • 运行Windows 8.1 64位.

更新2

如果我按照某些人的建议明确指定了主体,我会收到此错误(执行为sa):

SELECT IS_ROLEMEMBER('my_user', 'MYDOMAIN\UserX')

Msg 15404, Level 16, State 19, Line 1
Could not obtain information about Windows NT group/user 'MYDOMAIN\UserX',
error code 0x54b.
Run Code Online (Sandbox Code Playgroud)

可能是IS_ROLEMEMBER遇到同样的问题,但不打印错误?

小智 5

我只是遇到了同样的问题...我发现有问题的用户也分配了服务器角色。当我删除除“ public”以外的所有服务器角色时,突然is_rolemember查询开始正确地报告1而不是0 .....我来回测试了几次以确认。