【发布时间】:2013-11-12 08:18:15
【问题描述】:
运行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上,我使用用户sa创建了一个数据库test。已添加角色my_user。 - 在
Management Studio中以sa身份登录,并将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'
这也显示了我的会员资格:
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 遇到了同样的问题,但没有打印错误?
【问题讨论】:
-
IS_MEMBER()呢? -
试过了。结果相同。
-
它真的返回 0 还是 NULL?
-
服务器登录名是否也可能是 Windows 用户组的名称?另外,当 SELECT IS_ROLEMEMBER('my_user', 'username') 时会产生什么结果?
-
嗯。现在它起作用了。会不会这个函数为数据库所有者返回0?
标签: sql-server ssms