IS_SRVROLEMEMBER (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例
指示 SQL Server 登录名是否为指定服务器角色的成员。
语法
IS_SRVROLEMEMBER ( 'role' [ , 'login' ] )
参数
' role '
要检查的服务器角色的名称。 role 为 sysname 。
role 的有效值是用户定义的服务器角色和以下固定服务器角色 :
- sysadmin
- serveradmin
- dbcreator
- setupadmin
- bulkadmin
- securityadmin
- diskadmin
- 公共
- processadmin
' login '
是要检查的 SQL Server 登录名。 login 的数据类型为 sysname,默认值为 NULL。 如果未指定值,则结果视当前执行上下文而定。 如果参数包含单词 NULL,则返回 NULL。
注意
虽然 Microsoft Entra 登录名为 Azure SQL 数据库 和 Azure Synapse 的公共预览版,但不支持使用用于登录的 Microsoft Entra 主体。
返回类型
int
返回值 | 说明 |
---|---|
0 | login 不是角色的成员。 在 Azure SQL 数据库中,此语句始终返回 0。 |
1 | login 是 role 的成员 。 |
Null | 角色 或 登录 名无效,或者您没有查看角色成员身份的权限。 |
注解
使用IS_SRVROLEMEMBER来确定当前用户是否可以执行需要服务器角色权限的操作。
如果为 login 指定了 Windows 登录名(例如 Contoso\Mary5),那么除非针对该登录名授予或拒绝了对 SQL Server 的直接访问权限,否则 IS_SRVROLEMEMBER 将返回 NULL。
如果未提供可选 登录 参数,并且 登录 名是 Windows 域登录名,则它可能是固定服务器角色的成员,通过 Windows 组中的成员身份。 要解析这种间接成员身份,IS_SRVROLEMEMBER 将从域控制器中请求 Windows 组成员身份信息。 如果域控制器不可访问或未响应, IS_SRVROLEMEMBER 只考虑用户及其本地组来返回角色成员身份信息。 如果指定的用户不是当前用户,则由IS_SRVROLEMEMBER返回的值可能与验证器的上次数据更新与 SQL Server 的验证器(如 Active Directory)的值不同。
如果提供了可选的登录参数,则查询的 Windows 登录名必须存在于sys.server_principals中,否则IS_SRVROLEMEMBER返回 NULL。 这表示登录名无效。
如果登录名参数为域登录名或基于 Windows 组,且无法访问域控制器,则对 IS_SRVROLEMEMBER 的调用将失败,并可能返回不正确或不完整的数据。
如果域控制器不可用,则调用IS_SRVROLEMEMBER在本地对 Windows 主体进行身份验证(例如本地 Windows 帐户或 SQL Server 登录名)时返回准确的信息。
在某一 Windows 组用作登录参数,并且此 Windows 组是另一个 Windows 组的成员,而该组又是指定服务器角色的成员时,IS_SRVROLEMEMBER 始终返回 0。
用户帐户控制 (UAC) 设置也可能导致返回不同的结果。 这取决于用户在访问服务器时是作为 Windows 组成员还是特定的 SQL Server 用户。
此函数计算角色成员身份,而不是基础权限。 例如,sysadmin 固定服务器角色具有 CONTROL SERVER 权限 。 如果用户具有 CONTROL SERVER 权限,但不是角色的成员,则此函数将正确报告用户不是 sysadmin 角色的成员,即使用户具有相同的权限。
相关函数
若要确定当前用户是指定 Windows 组的成员、Microsoft Entra 组还是 SQL Server 数据库角色的成员,请使用 IS_MEMBER (Transact-SQL)。 若要确定某个 SQL Server 登录名是否为数据库角色的成员,请使用 IS_ROLEMEMBER (Transact-SQL)。
权限
要求具有服务器角色的 VIEW DEFINITION 权限。
示例
以下示例指示当前用户的 SQL Server 登录名是 sysadmin
固定服务器角色的成员。
IF IS_SRVROLEMEMBER ('sysadmin') = 1
print 'Current user''s login is a member of the sysadmin role'
ELSE IF IS_SRVROLEMEMBER ('sysadmin') = 0
print 'Current user''s login is NOT a member of the sysadmin role'
ELSE IF IS_SRVROLEMEMBER ('sysadmin') IS NULL
print 'ERROR: The server role specified is not valid.';
以下示例指示域登录名 Pat 是否是 diskadmin 固定服务器角色的成员。
SELECT IS_SRVROLEMEMBER('diskadmin', 'Contoso\Pat');