IS_SRVROLEMEMBER (Transact-SQL)

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

指示 SQL Server 登录名是否为指定服务器角色的成员。

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

语法

IS_SRVROLEMEMBER ( 'role' [ , 'login' ] )  

备注

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

参数

' role '
要检查的服务器角色的名称。 role 为 sysname 。

role 的有效值是用户定义的服务器角色和以下固定服务器角色 :

  • sysadmin
  • serveradmin
  • dbcreator
  • setupadmin
  • bulkadmin
  • securityadmin
  • diskadmin
  • 公共
  • processadmin

' login '
要检查的 SQL Server 登录的名称。 login 的数据类型为 sysname,默认值为 NULL。 如果未指定值,则结果视当前执行上下文而定。 如果此参数包含词 NULL,将返回 NULL。

返回类型

int

返回值 说明
0 login 不是 role 的成员 。

在 Azure SQL 数据库中,此语句始终返回 0。
1 login 是 role 的成员 。
Null role 或 login 无效,或者没有查看角色成员身份的权限 。

备注

使用 IS_SRVROLEMEMBER 可确定当前用户是否可以执行需要服务器角色权限的操作。

如果为 login 指定了 Windows 登录名(例如 Contoso\Mary5),那么除非针对该登录名授予或拒绝了对 SQL Server 的直接访问权限,否则 IS_SRVROLEMEMBER 将返回 NULL 。

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

如果提供了可选的 login 参数,则 sys.server_principals 中必须存在要查询的 Windows 登录名,否则 IS_SRVROLEMEMBER 将返回 NULL。 这指示该登录名无效。

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

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

在某一 Windows 组用作登录参数,并且此 Windows 组是另一个 Windows 组的成员,而该组又是指定服务器角色的成员时,IS_SRVROLEMEMBER 始终返回 0。

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

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

若要确定当前用户是否为指定 Windows 组或 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');  

另请参阅

IS_MEMBER (Transact-SQL)
安全函数 (Transact-SQL)