一、数据库用户帐号
1.登录帐号与用户帐号
当用户通过身份验证,以某个登录帐号连接到SQL Server以后,还必须取得相应数据库的“访问许可”,才能使用该数据库。这种用户访问数据库权限的设置是通过用户帐号来实现的。
登录帐号是属于服务器的层面。而登录者要使用服务器中的数据库数据时,必须要有用户帐号。就如同在公司门口先刷卡进入大门(登录服务器),然后再拿钥匙打开自己的办公室门(进入数据库)一样。
【例1】 使用登录帐号与访问数据库。
首先,我们用系统存储过程sp_addlogin创建一个登录帐号zhou_li,如下所示:
Exec sp_addlogin zhou_li,sqlpassword
因为没有指定默认数据库,所以系统数据库master即为其默认数据库。现在,我们用该用户登录名登录SQL Server,系统允许进入。但当我们在企业管理器中要访问teachdb数据库中的表时,系统报错,提示zhou_li不是teachdb数据库的有效用户。如下图所示。

按上图中“确定”按钮后,在“表”所对应的项目窗口中没有出现具体的数据表对象名,而是提示没有可显示的项目。如下图所示。
但是如果我们以sa帐号登录到SQL Server,因为sa是系统管理员帐户,它自动与每一个数据库用户dbo相关联,所以就能访问任何一个数据库及其对象。
![]()
对非数据库有效用户不显示具体数据库对象
通常而言,数据库用户帐号总是与某一登录帐号相关联,系统管理员可以将一个登录帐号映射到需要访问的数据库上,成为一个用户帐号。也可以将一个登录帐号在不同的数据库上映射成不同的用户,从而具有不同的权限。
2.默认用户帐号
数据库中有两个默认用户:一个是dbo用户帐号,另一个是guest用户帐号。
dbo代表数据库的拥有者(database owner)。每个数据库都有dbo用户,创建数据库的用户是该数据库的dbo,系统管理员也自动被映射成dbo。
guest用户帐号在安装完SQL Server系统后被自动被加入到master、pubs、tempdb、和northwind数据库中,且不能被删除。用户自己创建的数据库默认情况下不会自动加入guest帐号,但可以手工创建。guest用户也可以像其他用户一样设置权限。当一个数据库具有guest用户帐号时,允许没有用户帐号的登录者访问该数据库。所以guest帐号的设立方便了用户的使用,但如使用不当也可能成为系统安全隐患。
二、用户权限及数据库角色
在数据库中为对应用户创建了用户帐户后,即允许该用户访问数据库。但它在此数据库中可执行什么操作、有哪些权限,还必须进一步加以设置。就像一个人在公司门口先刷卡进入大门(登录服务器),然后再敲开办公室门(进入数据库),此时,不同的人员(例如,该办公室的主人、该办公室来访的客人、负责打扫该办公室的清洁人员)只能从事与己身份相符的操作。
在SQL Server中,用户若要进行任何涉及更改数据库定义或访问数据的活动,必须有相应的权限。通过设置用户帐户的权限和用户所属的角色及角色的权限,可以控制用户对数据库所允许的操作。权限存储在每个数据库的sysprotects系统表中。
(1)SQL Server中的权限可以分为以下三种:对象权限、语句权限和隐含权限。
1、对象权限
对象权限是指用户在数据库中执行与表、视图、存储过程等数据库对象有关的操作的权限。例如,是否可以查询表或视图,是否允许向表中插入记录或修改、删除记录,是否可以执行存储过程等。
对象权限的主要内容有:
对表和视图,是否可以执行SELECT、INSERT、UPDATE、DELETE语句;
对表和视图的列,是否可以执行SELECT、UPDATE语句的操作,以及在实施外键约束时作为REFERENCES参考的列;
对存储过程,是否可以执行EXECUTE。
2、语句权限
语句权限是指用户创建数据库和数据库中对象(如表、视图、自定义函数、存储过程等)的权限。例如,如果用户想要在数据库中创建表,则应该向该用户授予 CREATE TABLE 语句权限。语句权限适用于语句自身,而不是针对数据库中的特定对象。
语句权限实际上是授予用户使用某些创建数据库对象的Transact-SQL语句的权力。
只有系统管理员、安全管理员和数据库所有者才可以授予用户语句权限。
3、隐含权限
隐含权限是指特定用户预定义的操作权限,它不需明确指定,也不能撤消。例如,系统管理员用户具有SQL Server中的所有操作权限。
数据库对象所有者也有隐含权限,可以对所拥有的对象执行一切活动。例如,表的拥有者用户可以查看、添加或删除表中数据,更改表定义,或控制允许其他用户对该表进行操作的权限。
(2)数据库角色
为了方便数据库用户的权限设置和管理,SQL Server中使用数据库角色的概念和方法。数据库角色实际上就是具有某些特定数据库操作权限的用户组。SQL Server数据库角色存在于一个数据库中,不能跨多个数据库。
使用数据库角色的好处是:通过将用户添加到某个数据库角色中去,就可直接为其赋予了该角色规定的权限。此外,通过修改数据库角色的权限也就修改了隶属于该角色的所有用户的权限。 在同一数据库中,一个用户可属于多个角色。
在SQL Server 2000中,系统提供了预定义的固定数据库角色,用户也可自定义数据库角色。
1、固定数据库角色
固定数据库角色是在SQL Server每个数据库中都存在的系统预定义用户组。它们提供了对数据库常用操作的权限。系统管理员可以将用户加入这些角色中,固定数据库角色的成员也可将其他用户添加到本角色中。但固定数据库角色本身不能被添加、修改或删除。
在SQL Server 2000中还有一个名为public的较为特殊的固定数据库角色。数据库中每一个用户默认都属于该角色,它捕获数据库中用户的所有默认权限。但默认情况下,public角色对用户表、视图、存储过程等对象没有任何权限,它只能查看一些系统表的信息以及执行某些系统存储过程。如果我们要使数据库中新加入的用户默认就有什么权限,可为public角色添加相应的权限。但注意在public角 色上设置的权限对该数据库所有用户都有效,所以要慎重。
可以使用系统存储过程sp_helpdbfixedrole来查看下表所示的固定数据库角色
