对于需要进行数据访问的应用程序来说,仅仅为其授权访问SQL Server 实例是不够的。在授权访问SQL Server 实例之后,需要对特定的数据库进行访问授权。可以通过创建数据库用户并且将数据库登录名与数据库用户映射来授权对数据库的访问。每一个登录名都在它要访问的数据库中映射了一个数据库用户。除了dbo数据库用户外,每一个数据库用户都映射了一个数据库登录名。
注意 在SQL Server的先前版本中,可以使用系统存储过程sp_addalias将多个登录名映射到一个数据库用户。在SQL Server 2005中仍然可以这样。但应该避免使用,因为它是一种被认为是过时的功能,并且在未来的版本中可能会去除该功能。
数据库用户是数据库这一级的主体。所有数据库登录名,除了服务器角色sysadmin的成员,都要在自己要访问的数据库中与一个数据库用户建立映射。sysadmin角色的成员与所有服务器数据库上的dbo用户建立有映射。
2.4.1 创建数据库用户
可以使用CREATE USER语句创建数据库用户。以下Transact SQL示例创建了一个名为Peter的登录名并且将它与AdventureWorks数据库中的Peter用户进行了映射。
-- Create the login Peter
CREATE LOGIN Peter WITH PASSWORD='Tyu87IOR0';
-- Change the connection context to the database AdventureWorks.
USE AdventureWorks;
GO
-- Create the database user Peter,
-- mapped to the login Peter in the database AdventureWorks.
CREATE USER Peter FOR LOGIN Peter; //建立用户与登陆名映射关系
2.4.2 管理数据库用户
可以通过执行以下语句来检查当前的登录名是否可以登录到某个数据库:
SELECT HAS_DBACCESS('AdventureWorks');
可以通过查询目录视图sys.database_principals来获取数据库用户的信息。
如果需要临时禁用某个数据库用户对数据库的访问,可以通过取消这个用户的CONNECT授权来实现。
以下示例将撤消用户Peter的CONNECT授权:
-- Change the connection context to the database AdventureWorks.
USE AdventureWorks;
GO
-- Revoke connect permission from Peter
-- on the database AdventureWorks.
REVOKE CONNECT TO Peter;
可以使用DROP USER语句删除一个数据库用户。
警告 SQL Server 2005不允许删除一个拥有数据库架构的用户。
2.4.3 管理孤立用户
孤立用户指当前SQL Server实例中没有映射到登录名的数据库用户。在SQL Server 2005中,用户所映射的登录名被删除后,它就会变成孤立用户。为了获取孤立用户的信息,可以执行以下代码:
-- Change the connection context to the database AdventureWorks.
USE AdventureWorks;
GO
-- Report all orphaned database users
EXECUTE sp_change_users_login @Action='Report';
SQL Server 2005允许我们使用WITHOUT LOGIN子句来创建一个没有映射到登录名的用户。用WITHOUT LOGIN子句创建的用户不会被当作孤立用户。这个特性在需要改变一个模块的(执行上下文)时非常有用。本章后文将详细介绍执行上下文。以下代码将创建一个没有映射到登录名的用户Paul:
-- Change the connection context to the database AdventureWorks.
USE AdventureWorks;
GO
-- Creates the database user Paul in the AdventureWorks database
-- without mapping it to any login in this SQL Server instance
CREATE USER Paul WITHOUT LOGIN;
2.4.4 启用Guest用户
一个没有映射到用户的登录名试图登录到数据库的时候,SQL Server将尝试使用Guest用户进行连接。Guest用户是一个默认创建的没有任何权限的用户。我们可以通过为Guest用户授权CONNECT权限以启用Guest用户,如下所示:
-- Change the connection context to the database AdventureWorks.
USE AdventureWorks;
GO
-- Grant Guest access to the AdventureWorks database.
GRANT CONNECT TO Guest;
在考虑是否启用Guest用户的时候一定要谨慎,因为这样会为数据库系统环境的安全带来隐患。