IS_ROLEMEMBER (Transact-SQL)

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库 是Azure SQL 托管实例 是Azure Synapse Analytics 是并行数据仓库

指示指定的数据库主体是否为指定数据库角色的成员。

主题链接图标 Transact-SQL 语法约定

语法

IS_ROLEMEMBER ( 'role' [ , 'database_principal' ] )  

备注

若要查看 SQL Server 2014 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

' role '
要检查的数据库角色的名称。 role 为 sysname 。

' database_principal '
要检查的数据库用户、数据库角色或应用程序角色的名称。 database_principal 的数据类型为 sysname,默认值为 NULL。 如果未指定值,则结果视当前执行上下文而定。 如果此参数包含词 NULL,将返回 NULL。

备注

不支持对 database_principal 使用 Azure AD 主体。

返回类型

int

返回值 说明
0 database_principal 不是 role 的成员。
1 database_principal 是 role 的成员。
Null database_principal 或 role 无效,或者你没有查看角色成员身份的权限。

注解

如果 Azure AD 管理员是 Azure AD 组的成员,则该管理员不支持 IS_ROLEMEMBER 函数。 属于 Azure AD 组成员的 Azure AD 用户支持 IS_ROLEMEMBER 函数,除非该组是 Azure AD 管理员组。

请使用 IS_ROLEMEMBER 确定当前用户是否可以执行需要数据库角色权限的操作。

如果 database_principal 基于 Windows 登录名,如 Contoso\Mary5,则 IS_ROLEMEMBER 返回 NULL,除非为 SQL Server 授予或拒绝了 database_principal 的直接访问权限。

如果未提供可选的 database_principal 参数,并且 database_principal 基于 Windows 域登录名,则它可能是通过 Windows 组成员身份而成为的数据库角色成员。 要解析这种间接成员身份,IS_ROLEMEMBER 将从域控制器中请求 Windows 组成员身份信息。 如果无法访问域控制器或域控制器没有响应,则 IS_ROLEMEMBER 在返回角色成员身份信息时只考虑用户及其本地组。 如果指定的用户不是当前用户,则 IS_ROLEMEMBER 返回的值可能不同于验证器(如 Active Directory)上次进行的 SQL Server 数据更新。

如果提供了可选的 database_principal 参数,则要查询的数据库主体必须在 sys.database_principals 中存在,否则,IS_ROLEMEMBER 将返回 NULL。 这表明 database_principal 在此数据库中无效。

如果 database_principal 参数基于域登录名或 Windows 组,并且无法访问域控制器,则对 IS_ROLEMEMBER 的调用将失败,并且可能会返回不正确或不完整的数据。

如果域控制器不可用,并且可以在本地对 Windows 主体进行身份验证时(例如本地 Windows 帐户或 SQL Server 登录名),对 IS_ROLEMEMBER 的调用将返回准确的信息。

在某一 Windows 组用作数据库主体参数,并且此 Windows 组是另一个 Windows 组的成员,而该组又是指定数据库角色的成员时,IS_ROLEMEMBER 始终返回 0。

Windows Vista 和 Windows Server 2008 中的用户帐户控制 (UAC) 可能也会返回不同的结果。 这取决于用户在访问服务器时是作为 Windows 组成员还是特定的 SQL Server 用户。

此函数计算角色成员身份,而不是基础权限。 例如,db_owner 固定数据库角色具有 CONTROL DATABASE 权限。 如果用户具有 CONTROL DATABASE 权限,但不是该角色的成员,此函数将正确报告用户不是 db_owner 角色的成员,即使用户具有相同的权限也是如此。

若要确定当前用户是否为指定 Windows 组或 SQL Server 数据库角色的成员,请使用 IS_MEMBER (Transact-SQL)。 若要确定 SQL Server 登录名是否为服务器角色的成员,请使用 IS_SRVROLEMEMBER (Transact-SQL)

权限

要求具有数据库角色的 VIEW DEFINITION 权限。

示例

以下示例指示当前用户是否为 db_datareader 固定数据库角色的成员。

IF IS_ROLEMEMBER ('db_datareader') = 1  
   print 'Current user is a member of the db_datareader role'  
ELSE IF IS_ROLEMEMBER ('db_datareader') = 0  
   print 'Current user is NOT a member of the db_datareader role'  
ELSE IF IS_ROLEMEMBER ('db_datareader') IS NULL  
   print 'ERROR: The database role specified is not valid.';  

另请参阅

CREATE ROLE (Transact-SQL)
ALTER ROLE (Transact-SQL)
DROP ROLE (Transact-SQL)
CREATE SERVER ROLE (Transact-SQL)
ALTER SERVER ROLE (Transact-SQL)
DROP SERVER ROLE (Transact-SQL)
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
安全函数 (Transact-SQL)