IS_ROLEMEMBER (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

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

Transact-SQL 语法约定

注意

Microsoft Entra ID 以前称为 Azure Active Directory(Azure AD)。

语法

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

注意

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

参数

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

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

返回类型

int

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

注解

当管理员是 Microsoft Entra 组的成员时,Microsoft Entra 管理员不支持IS_ROLEMEMBER函数。 除非该组是 Microsoft Entra 管理员,否则 Microsoft Entra 用户支持IS_ROLEMEMBER函数。

请使用 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 参数基于域登录名或 Windows 组,并且无法访问域控制器,则对 IS_ROLEMEMBER 的调用将失败,并且可能会返回不正确或不完整的数据

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

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

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

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

sysadmin 固定服务器角色的成员均以 dbo 用户身份进入每个数据库。 检查 sysadmin 固定服务器角色成员的权限会检查 dbo 的权限,而不是原始登录名。 由于 dbo 无法添加到数据库角色,并且 Windows 组中不存在, 因此 dbo 始终返回 0(如果角色不存在,则为 NULL)。

若要确定当前用户是指定 Windows 组、Microsoft Entra 组还是 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)