IS_ROLEMEMBER无法正常工作

时间:2017-07-25 11:06:27

标签: sql

我需要检查用户是否具有角色DatabaseMailUserRole

我试过了:

SELECT IS_MEMBER('DatabaseMailUserRole')

SELECT IS_ROLEMEMBER ('DatabaseMailUserRole', '<loginname>')

两者都返回correctincorrect的值。

这意味着对于多次登录,它会返回正确的值,但对于其他人则不会。

1 个答案:

答案 0 :(得分:0)

DatabaseMailUserRole是sql server,据我所知。您的逻辑问题是DatabaseMailUserRole是数据库角色,因此映射到用户,而不是登录

用户(数据库级别)和登录(服务器级别)是不同的对象要访问服务器上的数据库,用户需要登录名和用户名。同一个人的登录和用户对象可以(但不是必须)共享相同的名称

例如

CREATE USER someuser FROM LOGIN 'domain\login';
GO
EXEC sp_addrolemember 'DatabaseMailUserRole','someuser';
GO

/* the following will fail because only users can be added to database role DatabaseMailUserRole */
EXEC sp_addrolemember 'DatabaseMailUserRole','domain\login';
GO  


EXECUTE AS login = 'domain\login'
SELECT IS_MEMBER('DatabaseMailUserRole') -> true

/* login 'domain\login' has username someuser */

SELECT CURRENT_USER -> 'someuser'
SELECT SYSTEM_USER ->  'domain\login'


SELECT IS_ROLEMEMBER ('DatabaseMailUserRole', 'domain\login') -> NULL
SELECT IS_ROLEMEMBER ('DatabaseMailUserRole', 'someuser') -> True

因此 IS_ROLEMEMBER应该被调用w / arguments,如下所示:

SELECT IS_ROLEMEMBER ('DatabaseMailUserRole', '<user_name>')

/* where user name is one of the following */
SELECT name FROM sys.database_principals WHERE type=N'U'; 
/* OR */
SELECT USER_NAME()
/* OR */
SELECT CURRENT_USER

在某些情况下,使用登录名可能会获得正确的结果,因为服务器级登录可以映射到具有相同名称的数据库级用户。