第16章安全管理本章从安全性的角度对SQLServer2008系统的基本管理方法进行分析讲解,因为无论对于系统管理员还是数据库编程人员,甚至对于每个用户,数据库系统的安全性都是至关重要的。通过对本章的学习,可以了解到要想确保系统的安全性,应该学会使用用户账户,同时还应该给账户授予相应的权限,对用户、角色和权限的管理可以进行管理的操作。16.1SQLServer2008的安全认证模式当用户使用SQLServer2008时,需要经过两个安全性阶段,身份验证阶段和权限认证阶段。身份验证阶段:SQLServer2008或者Windows对用户进行验证。如果验证通过,用户就可以连接到SQLServer2008服务器上。否则,服务器将拒绝用户登录,从而保证系统的安全性。权限认证阶段:身份验证的通过只表示用户可以连接到SQLServer2008服务器上。然后,需要检测用户是否有访问服务器数据的权限,为此需要授予每个数据库中映射到用户登录的账户访问权限。16.1.1身份验证阶段在验证阶段,系统对用户登录进行验证。SQLServer2008和Windows是结合在一起的,它们会产生两种验证模式:Windows身份验证模式和混合身份验证模式。16.1.2权限认证阶段为防止不合理的使用造成数据的泄密和破坏,SQLServer2008数据库管理系统除使用身份验证方法来限制用户进入数据库系统外,还使用权限认证来控制用户对数据库的操作。当以用户身份通过验证连接到SQLServer2008服务器后,在用户可以访问的每个数据库中都要求单独的用户账号,对于没有账户的数据库,将无法访问。此时,用户虽然可以发送各种Transact-SQL语句,但是这些操作语句在数据库中是否能够成功地执行,还取决于该用户账户在该数据库中对这些操作拥有的权限。如果发出操作命令的用户没有执行该语句的权限或者访问该对象的权限,则SQLServer2008将不会执行该操作语句。所以,若没有通过数据库的权限认证,即使用连接到SQLServer2008服务器上,也无法使用数据库。16.2管理登录账户在SQLServer2008中可以通过SSMS和系统存储过程两种不同的方法来创建登录帐户。16.2.1使用SSMS创建SQLServer2008登录账户使用SQLServerManagementStudio创建登录帐户的步骤如下:16.2.2使用系统存储过程创建SQLServer2008登录账户要在SQLServer2008服务器中添加登录账户,可以使用系统存储过程sp_addlogin。其创建登录账号的语法格式如下:Sp_addlogin[@loginame=]'login'[,[@password=]'password'][,[@defdb=],'database'][,[@deflanguage=]'language'][,[@sid=]sid][,[@encryptopt=]'encryption_option']16.3创建数据库的用户SQLServer2008账号有如下两种:登录服务器的登录账号:指能登录到SQLServer2008服务器的账号,属于服务器的层面。它本身并不能让用户访问服务器中的数据库。使用数据库的用户账号:登录到SQLServer2008服务器中的数据时,必须使用用户账号才能够存取数据库,就如同公司门口先刷卡进人,然后再拿钥匙打开自己的办公室一样。用户名要在特定的数据库内创建,并关联一个登录名。用户定义的信息存放在服务器的每个数据库的SYSUERS表中。通过授权给用户来指定用户可以访问对象的权限。16.3.1使用SQLServerManagementStudio创建SQLServer2008数据库用户使用SQLServerManagementStudio创建数据库用户的步骤如下:(1)在【对象资源管理器】面板中,展开某一数据库,如wj的文件夹。再展开【安全】选项,然后右击【用户】分支,在弹出的对话框中单击【新建用户】命令,弹出的【新建用户】对话框,如图16.9所示。(2)选中【登录名】单选按钮,选择登录账号如wj_log登录账号。在【用户名】文本框中输入用户名如wj_user,也可以在【数据库角色成员身份】列表中选择新建用户应该属于的数据角色。(3)设置完毕后,单击【确定】按钮,即可在wj数据库中创建一个新的用户账号。如果不想创建用户账号,单击【取消】按钮即可。16.3.2使用存储过程创建数据库用户下面学习用于创建数据库用户的存储过程。1.使用sp_adduser创建数据库用户该存储过程用于添加新的用户。语法格式如下:sp_adduser[@loginame=]'login'[,[@name_in_db=]'user'][,[@grpname=]'group']2.使用sp_grantdbaccess本存储过程为SQLServer2008或Windows用户或组在当前数据库中添加一个安全帐户,并使其能够被授予在数据库中执行活动的权限。语法格式为:sp_grantdbaccess[@loginame=]'login'[,[@name_in_db=]'name_in_db’]16.4安全管理账户在SQLServer2008中管理着系统管理员、普通用户等多种帐户,这些帐户拥有自己的账号和密码及权限。本节学习如何对各类账户进行管理。16.4.1查看服务器的登录帐号SQLServer2008可以分别通过系统存储过程和SSMS来查看登录帐号。1.使用系统存储过程查看登录账号2.使用SSMS查看登录账号16.4.2修改登录帐号属性同样,SQLServer2008可以分别通过系统存储过程和SSMS来修改登录帐号。1.使用存储过程修改登录属性2.使用SQLServerManagementStudio修改登录账户属性16.4.3查看数据库的用户在SQLServer2008中,也可以通过SSMS和存储过程来查看数据库的用户。1.使用SSMS查看数据库的用户2.用存储过程查看数据库的用户16.5删除登录和用户帐户通过SQLServer2008可以完成登录和用户帐户的创建,同样,也可以完成相应帐户的删除任务。本节将学习如何删除登录和用户帐户。16.5.1删除登录账号在SQLServer2008中可以通过SSMS和存储过程两种方式来删除登录帐号。1.使用SQLServerManagementStudio删除登录账号启动SQLServerManagementStudio进入【对象资源管理器】面板,再展开【安全性】选项,展开【登录名】选项,选中要删除的登录名,再右击,在弹出的对话框中,选择【删除】命令即可确定。2.使用存储过程删除登录账号使用存储过程sp_droplogin可删除某一登录账号,其语法格式如下:sp_droplogin'login'16.5.2删除用户账号在SQLServer2008中可以通过SSMS和存储过程来实现用户帐号删除。1.使用SQLServerManagementStudio删除用户账号在【对象资源管理器】面板中,展开某个数据库,展开【安全性】|【用户】选项,右击要删除的用户,在弹出的对话框中单击【删除】命令。在弹出的对话框中,单击【确定】按钮,即可完成操作。2.使用sp_revokedbaccess可删除用户账号语法格式为:sp_revokedbaccess'name'16.6数据库用户和角色管理角色是由一组用户所构成的组,可以分为服务器角色和数据库角色。本节将对数据库用户与角色管理的内容展开学习。16.6.1服务器角色管理服务器角色是负责管理与维护SQLServer2008的组,一般只会指定需要管理服务器登录账号属于服务器角色。16.6.2.标准角色与应用程序角色在SQLServer2008中,数据库角色可分为两种:标准角色和应用程序角色。1.标准角色标准角色是由数据库成员所组成的组,此成员可以是用户或者其他的数据库角色,在创建一个数据库时,系统默认创建10个固定的标准角色,在【对象资源管理器】面板中,展开【数据库】选项,再展开某个数据库的文件夹,然后展开【安全性】选项,展开【角色】下面的【数据库角色】选项2.应用程序角色应用程序角色用来控制应用程序存取数据的,本身并不包括任何成员。在编写数据库的应用程序时,可以自定义应用程序角色,让应用程序的操作能用编写的程序来存取SQLServer的数据。也就是说,应用程序的操作者本身并不需要在SQLServer2008上拥有登录账号以及用户账号,但是仍然可以存取数据库。16.6.3创建新的角色在SQLServer2008中,可以通过存储过程和SSMS实现角色的创建。1.使用存储过程创建角色使用sp_addrole在当前数据库中创建新角色,其语法格式:sp_addrole'role','owner'2.使用SQLServerManagementStudio创建角色在【对象资源管理器】面板中,选择【数据库】选项,展开【wj】数据库的文件夹,然后在选择展开【安全性】选项。选中【角色】右击,在弹出的对话框中,单击【新建数据库角色】命令,弹出【数据库角色-新建】对话框。在该窗口中,输入相应的角色名称“wj_role1”和所有者“dbo”,选择角色拥有的架构及添加相应的角色成员即可16.6.4删除角色在SQLServer2008中可以通过SSMS和存储过程来实现角色的删除。1.使用SQLServerManagementStudio删除角色在【对象资源管理器】对话框中,选中【数据库】选项,展开某一数据库。然后展开【安全性】选项,再展开【角色】选项,在某一角色上右击,在弹出的对话框中单击【删除】命令即可。2.使用存储过程删除角色使用sp_droprole从当前数据库删除指定的角色,其语法为:sp_droprole'role'16.6.5查看角色的属性通过SQLServer2008还可以对各类角色的属性进行查看。以在wj数据库中的db_owner角色为例说明,操作步骤如下。(1)在【对象资源管理器】面板中,选择【数据库】选项,展开某个数据库的文件夹,然后选择展开【安全性】选项,选中【角色】选项展开。(2)右击如db_ower角色,在弹出的对话框中,选择【属性】命令,则弹出【数据库角色属性】对话框,可以看到相应的属性。在此对话框中,单击【添加】按钮,可为角色添加一个用户,单击【删除】按钮,可从角色中删除被选中的用户,但是dbo代表数据库的所有者,因此删除角色的时候是不能被删除的,如图16.23所示。16.6.6用户和角色的权限问题用户是否具有对数据库存取的能力,不仅要看其权限的设置,而且还要受到角色权限的限制。1.用户权限继承角色的权限在数据库角色中可以包含许多用户,用户对数据库对象的存取也就继承角色的权限。假设用户wj_user属于角色wj_rolel,角色wj_rolel已经取得对student表的SELECT权限,则用户wj_user也自动取得对student表的SELECT权限。如果wj_rolel对student表没有INSERT权限,而wj_user取得对student表的INSERT权限,则wj_user取得对student表的INSERT权限,则wj_user最终也取得对student表的INSERT权限。而拒绝是优先的,只要wj_rolel和wj_user中的任伺一个拒绝,则该权限就是拒绝的。2.用户分属于不同角色如果一个用户分属于不同的数据库角色。例如,用户wj_user既属于角色wj_rolel,又属于角色wj_role2,则用户wj_user的权限基本上是以wj_rolel和wj_role2的并集为准,但是只要有一个拒绝,那么用户wj_user的权限就是拒绝的。16.7数据库用户帐号的权限管理在SQLServer2008中包含有多个不同的数据库,各数据库含有不同的数据库用户,本节学习如何对这些数据库用户的帐号进行权限管理。16.7.1权限类型用户登录到SQLServer2008服务器后,角色和用户的权限已被决定