IS_SRVROLEMEMBER (Transact-SQL)

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

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

语法

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

参数

  • 'role'
    要检查的服务器角色的名称。role 的数据类型为 sysname。

    role 的有效值包括:

    • sysadmin

    • dbcreator

    • bulkadmin

    • diskadmin

    • processadmin

    • serveradmin

    • setupadmin

    • securityadmin

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

返回类型

int

注释

IS_SRVROLEMEMBER 返回以下值。

返回值

说明

0

login 不是 role 的成员。

1

login 不是 role 的成员。

NULL

role 或 login 无效。

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

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

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

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

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

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

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

Windows Vista 和 Windows Server 2008 中的用户帐户控制 (UAC) 可能也会返回不同的结果。这取决于用户在访问服务器时是作为 Windows 组成员还是作为特定的 SQL Server 用户。有关用户帐户控制的详细信息,请参阅如何从 Windows Vista 连接到 SQL Server

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

示例

以下示例指示当前用户的 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.'