有几个系统函数可返回用户名和用户 ID。要理解这些函数的参数和输出结果,首先必须理解 Microsoft® SQL Server™ 2000 中使用的名称和 ID 的类型。
登录到 SQL Server 的每个用户在 SQL Server 中都有两个级别的名称,每个名称都与一个唯一的 ID 相关联:
被授权登录到 SQL Server 的每个用户都有一个登录名,使他们得以访问 SQL Server 实例。有两种类型的登录名:
sysadmin 或 securityadmin 固定服务器角色成员可以使用 sp_grantlogin 对 Windows 组或 Windows 帐户的个别用户授权,使其可登录到 SQL Server 实例。于是,Windows 帐户所标识的用户或 Windows 组中的任何组员都可以使用 Windows 身份验证连接 SQL Server 实例。master.dbo.syslogins.loginname 中存储了所有 Windows 帐户名或组名。用于 Windows 帐户或组的 Windows security_identifier 存储在 syslogins.sid 中。
使用 SQL Server 身份验证登录时将用到这些登录名。SQL Server 登录名由 sysadmin 或 securityadmin 固定服务器角色的成员使用 sp_addlogin 进行定义。所有 SQL Server 登录名都存储在 master.dbo.syslogins.loginname 中。SQL Server 生成用作 security_identifier 的 GUID 并将其存储在 syslogins.sid 中。
SQL Server 2000 将 master.dbo.syslogins.sid 作为登录名的 security_identifier。
所有 Windows 帐户或 SQL Server 登录都必须与已授权用户访问的每个数据库中的用户名相关联,或者该数据库必须已启用客户访问。数据库用户名由 db_owner 或 db_accessadmin 固定数据库角色的成员来定义,并存储在每个数据库所建的 sysusers 表中。每个数据库用户名都与存储在 sysusers.uid 中的一个数据库用户 ID 相关联。
每个用户的 security_identifier 都存储在 sysusers.sid 中;因此,可将用户映射回他们相应的登录。如果使用同一数据库用户名作为 SQL Server 登录名或 Windows 帐户名,则可减少混淆;但是,不要求一定这样做。
有关登录和数据库用户帐户的更多信息,请参见登录、用户、角色和组。
连接到 SQL Server 2000 后,使用:
在 SQL Server 2000 中,返回登录名或帐户的函数以下面的方式操作:
SUSER_SNAME 具有以下选项之一:
如果没有为使用 Windows 身份验证进行的连接指定 security_identifier,则 SUSER_SNAME 将返回与该连接关联的 Windows 帐户名。如果是使用 SQL Server 身份验证进行的连接,SUSER_SNAME 将返回与该连接关联的 SQL Server 登录。
此 SQL-92 函数在 Transact-SQL 中实现为 SUSER_SNAME()(不指定 security_identifier 参数的 SUSER_SNAME)的同义词。
连接到 SQL Server 2000 后,使用:
SQL-92 允许在这样的 SQL 模块中对 SQL 语句进行编码:该模块的授权标识符与已连接到 SQL 数据库的用户的授权标识符可以相互独立。SQL-92 指定 SESSION_USER 总是返回进行连接的用户的授权标识符。对于从 SQL 模块执行的任何语句,CURRENT_USER 返回 SQL 模块的授权标识符;如果 SQL 语句不是从 SQL 模块执行的,则返回进行连接的用户的授权标识符。如果 SQL 模块没有单独的授权标识符,则 SQL-92 指定 CURRENT_USER 返回与 SESSION_USER 相同的值。Microsoft SQL Server 没有单独用于 SQL 模块的授权标识符,因此,CURRENT_USER 和 SESSION_USER 总是返回相同的值。USER 函数是由 SQL-92 为向后兼容性而定义的函数,用于为早期版本的标准所编写的应用程序。USER 被指定为与 CURRENT_USER 返回相同的值。
在 SQL Server 中,返回登录名或帐户的函数以下面的方式操作:
USER_ID 返回与指定数据库用户名关联的数据库用户 ID。如果未指定 database_user_name,则 USER_ID 返回与当前连接关联的数据库用户 ID。
USER_NAME 返回与指定的数据库用户 ID 关联的数据库用户名。如果未指定 database_user_ID,则 USER_NAME 返回与当前连接关联的数据库用户名。
这些函数都是 USER_NAME()(不指定 database_user_ID 参数的 USER NAME)的同义词。