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

标签 sql-server ssms

运行SQL Server 2012的本地实例。

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

CREATE ROLE [my_user] AUTHORIZATION [dbo]

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

对于经过Windows身份验证的用户,确实确实会返回1,但是以 SQL用户身份登录后,它会立即返回0 。我对SQL用户确实具有此角色进行了三重检查。我在这里想念什么?

更新

进行了更多测试。这肯定是奇怪的行为。我执行了以下步骤:
  • 在本地SQL Server上,我用用户test创建了一个数据库sa。角色my_user已添加。
  • sa中以Management Studio身份登录,并将MYDOMAIN\MyUser添加到该角色。
  • 使用Windows身份验证重新登录并执行IS_ROLEMEMBER('my_user')返回0。
  • 使用sa(指定用户名)和Windows用户尝试了该查询。同样的问题。
  • 尝试重新启动SQL Server,以防万一。

  • 这没有任何意义! 如果我右键单击该角色,我可以看到我的Windows用户确实是它的成员。 IS_ROLEMEMBER函数有缺陷!当我运行以下查询时,它表明我的用户确实是数据库角色的成员:
    SELECT
        USER_NAME(memberuid), USER_NAME(groupuid)
    FROM
        sys.sysmembers
    WHERE
        USER_NAME(groupuid) = 'my_user'
    

    这也显示了我的成员(member)资格:
    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
    

    一些其他信息:
  • 我在域上,但当前已断开连接。我也看到了连接时的这个问题。
  • 运行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.
    

    可能是IS_ROLEMEMBER遇到了同样的问题,但是没有显示错误?

    最佳答案

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

    关于sql-server - IS_ROLEMEMBER错误地为数据库角色成员返回0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19924072/

    相关文章:

    sql-server - 在 SSMS 中一次编写多个数据库对象的脚本

    sql-server - 为 SQL Server 表自动生成 INSERT 语句的最佳方法是什么?

    sql-server-2008 - 如何在 SQL Server Management Studio 中修改自动生成的脚本文件的默认文件名格式?

    sql-server - SSMS 间歇性地针对错误的数据库执行我突出显示的脚本

    mysql - Groovy SQL everyRow 格式输出

    sql-server - SQL Server 2005 - 比较 char 列与 int

    visual-studio-2010 - 使用 SQL Server Management Studio 打开驻留在 App_Data 中的 mdf 文件?

    sql - 自动递增订单号(一张表多个公司)

    mysql - 对于 SQL 递归 CTE,为什么它每次 'loops' 时不再次引用 anchor 成员?为什么主播成员只得到一次 'called'?

    c# - C# 链接到 SQL Server Express 的错误输出