适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
分析平台系统(PDW)
Microsoft Fabric中的SQL数据库
指示指定的数据库主体是否为指定数据库角色的成员。
注意
Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。
语法
IS_ROLEMEMBER ( 'role' [ , 'database_principal' ] )
参数
'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 用户支持IS_ROLEMEMBER函数,这些用户是Microsoft Entra 组的成员,除非该组是 Microsoft Entra 管理员。
请使用 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 DATABASE 权限但不是该角色的成员,该函数会正确报告该用户不是 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)