第9章 安全管理与数据库维护
数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄漏、更改或破坏。系统安全保护措施是否有效是数据库系统的主要指标之一。数据库的安全性和计算机系统的安全性(包括操作系统、网络系统的安全性)是紧密联系、相互支持的。
随着越来越多的网络相互连接,安全性也变得日益重要。公司的资产必须受到保护,尤其是数据库,它们存储着公司的宝贵信息。安全是数据引擎的关键特性之一,保护企业免受各种威胁。SQLServer 2008安全特性的宗旨是使其更加安全,且使数据保护人员能够更方便地使用和理解安全。
在SQL Server 2008中,为了保证数据的安全性,需要做到以下几方面工作:
l 选择合理的数据库架构;
l 对数据库系统进行合理的配置和权限设置;
l 经常对数据库中的数据进行及时备份与恢复;
本章我们就围绕数据库的安全性配置、数据库的架构设计以及对数据的备份与恢复操作等方面的内容,展开详细讲解。
本章学习目标:
- 了解数据库安全性的概述
- 掌握管理SQL Server服务器安全性
- 掌握管理角色
- 掌握管理架构
- 掌握管理权限
9.1 数据库安全性概述
数据库是电子商务、金融以及ERP系统的基础,通常都保存着重要的商业数据和客户信息,例如,交易记录、工程数据、个人资料等等。数据完整性和合法存取会受到很多方面的安全威胁,包括密码策略、系统后门、数据库操作以及本身的安全方案。另外,数据库系统中存在的安全漏洞和不当的配置通常会造成严重的后果,而且都难以发现。
9.1.1 SQL Server 2008安全管理新特性
在过去几年中,世界各地的人们对于安全的、基于计算机的系统有了更深刻的理解。Microsoft 在此过程中一直处于前沿,而SQL Server就是落实这种理解的首批产品之一。它实现了重要的“最少特权”原则,因此不必授予用户超出工作所需的权限。它提供了深层次的防御工具,可以采取措施防御最危险黑客的攻击。
微软SQL server 2008可以对整个数据库、数据文件和日志文件进行加密,而不需要改动应用程序。进行加密使公司可以满足遵守规范和及其关注数据隐私的要求。它为加密和密钥管理提供了一个全面的解决方案。满足不断发展的对数据中心的信息的更强安全性的需求,公司投资给供应商来管理公司内的安全密钥。微软 SQL server 2008使用户可以审查数据的操作,从而提高了遵从性和安全性。审查不只包括对数据修改的所有信息,还包括关于什么时候对数据进行读取的信息。
SQL Server 2008 提供了丰富的安全特性,用于保护数据和网络资源。它的安装更轻松、更安全,除了最基本的特性之外,其他特性都不是默认安装的,即便安装了也处于未启用的状态。SQL Server提供了丰富的服务器配置工具,特别值得关注的就是 SQL Server Surface Area Configuration Tool,它的身份验证特性得到了增强, SQL Server 更加紧密地与Windows身份验证相集成,并保护弱口令或陈旧的口令。有了细粒度授权、SQL Server Agent 代理和执行上下文,在经过验证之后,授权和控制用户可以采取的操作将更加灵活。元数据也更加安全,因为系统元数据视图仅返回关于用户有权以某种形式使用的对象的信息。在数据库级别,加密提供了最后一道安全防线,而用户与架构的分离使得用户的管理更加轻松。
9.1.2 SQL Server 2008安全性机制
对于数据库管理来说,保护数据不受内部和外部侵害是一项重要的工作。SQL Server 2005的身份验证、授权和验证机制可以保护数据免受未经授权的泄漏和篡改。
SQL Server的安全机制一般主要包括三个等级:
l 服务器级别的安全机制
这个级别的安全性主要通过登录帐户进行控制,要想访问一个数据库服务器 ,必须拥有一个登录帐户。登录帐户可以是Windows账户或组,也可以是SQL Server的登录账户。登录账户可以属于相应的服务器角色。至于角色,可以理解为权限的组合。
l 数据库级别的安全机制
这个级别的安全性主要通过用户帐户进行控制,要想访问一个数据库,必须拥有该数据库的一个用户账户身份。用户账户是通过登录账户进行映射的,可以属于固定的数据库角色或自定义数据库角色。
l 数据对象级别的安全机制
这个级别的安全性通过设置数据对象的访问权限进行控制。如果是使用图形界面管理工具,可以在表上右击,选择【属性】|【权限】选项,然后启用相应的权限复选框即可。
以上的每个等级就好像一道门,如果门没有上锁,或者用户拥有开门的钥匙,则用户可以通过这道门达到下一个安全等级。如果通过了所有的门,则用户就可以实现对数据的访问。这种关系可以用图9-1来表示。
图9-1 SQL Server 2008的安全性等级
通常情况下,客户操作系统安全的管理是操作系统管理员的任务。SQL Server不允许用户建立服务器级的角色。另外,为了减少管理的开销,在对象级安全管理上应该在大多数场合赋予数据库用户以广泛的权限,然后再针对实际情况在某些敏感的数据上实施具体的访问权限限制。 |
9.1.3 SQL Server 2008安全主体
在SQL Server 2008中,数据库中的所有对象都是位于架构内的。每一架构的所有者都是角色,而不是独立的用户,允许多用户管理数据库对象。这解决了旧版本中的一些问题,即没有重新指派每一个对象的所有者就不能从数据库中删除用户。现在,用户仅需要更改架构的所有权,而不用去更改每一个对象的所有权。
SQL Server2008中广泛使用安全主体和安全对象管理安全。一个请求服务器、数据库或架构资源的实体称为安全主体。每一个安全主体都有唯一的安全标识符(Secrity Identifier,ID)。安全主体在3个级别上管理:Windows、SQL Server和数据库。安全主体的级别决定了安全主体的影响范围。通常,Windows和SQL Server级别的安全主体具有实例级的范围,而数据库级别的安全主体的影响范围是特定的数据库。
表9-1中列出了每一级别的安全主体。这些安全主体,包括Windows组、数据库角色和应用程序角色,它们能包括其他安全主体。这些安全主体也成为集合,每个数据库用户属于 公共数据库角色。当一个用户在安全对象上没有被授予或被拒绝给予特定权限的时候,用户则继承了该安全对象上授予公共角色的权限。
表9-1 安全主体级别和所包括的主体
主体级别 |
主体对象 |
Windows级别 |
Windows域登录、Windows本地登录、Windows组 |
SQL Server级别 |
服务器角色、SQL Server登录 SQL Server登录映射为非对称密钥 SQL Server登录映射为证书 SQL Server登录映射为Windows登录 |
数据库级别 |
数据库用户、应用程序角色、数据库角色、公共数据库角色 数据库映射为非对称密钥 数据库映射为证书 数据库映射为Windows登录 |
最常用的加密方式有两种:对称加密和非对称加密。对称加密使用相同的密钥加密和解密数据,使用的算法相对于非对称加密的算法而言比较简单。非对称加密使用两个具有数学关系的不同密钥和解密数据。这两个密钥分别为私钥和公钥,它们合成为密钥对。非对称加密被认为比对称加密 更安全,因为数据的加密密钥与解密密钥不同。 |
安全主体能在分等级的实体集合(也称为安全对象)上分配特定的权限。如表9-2所示,最顶层的三个安全对象是服务器、数据库和架构。这些安全对象的每一个都包含其他的安全对象,后者依次又包含其他的安全对象,这些嵌套的层次结构称为范围。因此,也可以说SQL Server中的安全对象范围是服务器、数据库和架构。
表9-2 安全对象范围及包含的安全对象
安全对象范围 |
包含安全对象 |
服务器 |
服务器(当前实例)、数据库、端点、登录、服务器角色 |
数据库 |
应用程序角色、程序集、非对称密钥 证书、合同、数据库角色 全文目录、消息类型、远程服务绑定 路由、架构、服务、对称密钥、用户 |
架构 |
聚合、函数、过程 队列、同义词、表 类型、视图、XML架构集合 |
9.2 管理SQL Server服务器安全性
要想保证数据库数据的安全,必须搭建一个相对安全的运行环境。因此,对服务器安全性管理至关重要。在SQL Server 2008中,对服务器安全性管理主要通过更加健壮的验证模式,安全的登录服务器的账户管理以及对服务器角色的控制,从而,更加有力的保证了服务器的安全便捷。
9.2.1 身份验证模式
SQL Server 2008提供了Windows身份和混合身份两种验证模式,每一种身份验证都有一个不同类型的登录账户。无论哪种模式,SQL Server 2008都需要对用户的访问进行两个阶段的检验:验证阶段和许可确认阶段。
l 验证阶段 用户在SQL Server 2008获得对任何数据库的访问权限之前,必须登录到SQL Server上,并且被认为是合法的。SQL Server或者Windows要求对用户进行验证。如果验证通过,用户就可以连接到SQL Server 2008上;否则,服务器将拒绝用户登录
l 许可确认阶段 用户验证通过后会登录到SQL Server 2008上,此时系统将检查用户是否有访问服务器上数据的权限。
如果在服务器级别配置安全模式,它们会应用到服务器上的所有数据库。但是,由于每个数据服务器实例都有独立的安全体系结构,这就意味着不同的数据库服务器实例,可以使用不同的安全模式。 |
1.Windows身份验证
使用Windows身份验证模式是默认的身份验证模式,它比混合模式要安全得多。当数据库仅在内部访问时使用Windows身份验证模式可以获得最佳工作效率。在使用Windows身份验证模式时,可以使用Windows域中有效的用户和组账户来进行身份验证。这种模式下,域用户不需要独立的SQL Server用户账户和密码就可以访问数据库。这对于普通用户来说是非常有益的,因为这意味着域用户不需记住多个密码。如果用户更新了自己的域密码,也不必更改SQL Server 2008的密码。但是,在该模式下用户仍然要遵从Windows安全模式的所有规则,并可以用这种模式去锁定账户、审核登录和迫使用户周期性地更改登录密码。
当用户通过Windows用户帐户连接时,SQL Server使用操作系统中的Windows 主体标记验证帐户名和密码。也就是说,用户身份由Windows进行确认。SQL Server 不要求提供密码,也不执行身份验证。
图9-2所示,就是本地账户启用SQL Server Manage-ment Studio窗口是,使用操作系统中的Windows 主体标记进行的连接。
图9-2 Windows身份验证模式
其中,服务器名称中MR代表当前计算机名称,Administrator是指登录该计算机时使用的Windows账户名称。这也是SQL Server默认的身份验证模式,并且比SQL Server身份验证更为安全。Windows身份验证使用Kerberos安全协议,提供有关强密码复杂性验证的密码策略强制,还提供帐户锁定支持,并且支持密码过期。通过Windows身份验证完成的连接有时也称为可信连接,这是因为 SQL Server 信任由 Windows 提供的凭据。
Windows省份验证模式有以下主要优点:
l 数据库管理员的工作可以集中在管理数据库上面,而不是管理用户账户。对用户账户的管理可以交给Windows去完成。
l Windows有更强的用户账户管理工具。可以设置账户锁定、密码期限等。如果不通过定制来扩展SQL Server,SQL Server则不具备这些功能。
l Windows的组策略支持多个用户同时被授权访问SQL Server。
2.混合模式
使用混合安全的身份验证模式,可以同时使用Windows身份验证和SQL Server登录。SQL Server登录主要用于外部的用户,例如那些可能从Internet访问数据库的用户。可以配置从Internet访问SQL Server 2008的应用程序以自动地使用指定的账户或提示用户输入有效的SQL Server用户账户和密码。
使用混合安全模式,SQL Server 2008首先确定用户的连接是否使用有效的SQL Server用户账户登录。如果用户有有效的登录和使用正确的密码,则接受用户的连接;如果用户有有效的登录,但是使用不正确的密码,则用户的连接被拒绝。仅当用户没有有效的登录时,SQL Server 2008才检查Windows账户的信息。在这种情况下,SQL Server 2008将会确定Windows账户是否有连接到服务器的权限。如果账户有权限,连接被接受;否则,连接被拒绝。
当使用混合模式身份验证时,在SQL Server中创建的登录名并不基于Windows用户帐户。用户名和密码均通过使用SQL Server创建并存储在SQL Server中。通过混合模式身份验证进行连接的用户每次连接时必须提供其凭据(登录名和密码)。当使用混合模式身份验证时,必须为所有SQL Server帐户设置强密码。图9-3所示,就是选择混合模式身份验证的登录界面。
图9-3 使用SQL Server身份验证
如果用户是具有 Windows 登录名和密码的 Windows 域用户,则还必须提供另一个用于连接的(SQL Server)登录名和密码。记住多个登录名和密码对于许多用户而言都较为困难。每次连接到数据库时都必须提供 SQL Server 凭据也十分繁琐。混合模式身份验证的缺点如下所示。
l SQL Server身份验证无法使用 Kerberos 安全协议。
l SQL Server登录名不能使用 Windows 提供的其他密码策略。
混合模式身份验证的优点如下。
l 允许SQL Server支持那些需要进行SQL Server身份验证的旧版应用程序和由第三方提供的应用程序。
l 允许SQL Server支持具有混合操作系统的环境,在这种环境中并不是所有用户均由Windows域进行验证。
l 允许用户从未知的或不可信的域进行连接。例如,既定客户使用指定的SQL Server登录名进行连接以接收其订单状态的应用程序。
l 允许SQL Server支持基于Web的应用程序,在这些应用程序中用户可创建自己的标识。
l 允许软件开发人员通过使用基于已知的预设SQL Server登录名的复杂权限层次结构来分发应用程序。
使用SQL Server身份验证不会限制安装 SQL Server 的计算机上的本地管理员权限。 |
3.配置身份验证模式
通过前面的学习,大家已经对SQL Server 2008的两种身份验证模式有了一定的认识。下面我们将学习在安装SQL Server之后,设置和修改服务器身份验证模式的操作方法。
在第一次安装SQL Server 2008或者使用SQL Server 2008连接其他服务器的时候,需要指定验证模式。对于已指定验证模式的SQL Server 2008服务器还可以进行修改,具体操作步骤如下:
(1)打开SQL Server Management Studio窗口,选择一种身份验证模式建立与服务器的连接。
(2)在【对象资源管理器】窗口中右击当前服务器名称,选择【属性】命令,打开【服务器属性】对话框,如图9-4所示。
右击 |
图9-4 打开【服务器属性】对话框
在默认打开的【常规】选项卡中,显示了SQL Server 2008服务器的常规信息,包括SQL Server 2008的版本、操作系统版本、运行平台、默认语言以及内存和CPU等等。
(3)在左侧的选项卡列表框中,选择【安全性】选项卡,展开安全性选项内容,如图9-5所示。在此选项卡中即可设置身份验证模式。
图9-5 【安全性】选项卡
(4)通过在【服务器身份验证】选项区域下,选择相应的单选按钮,可以确定SQL Server 2008的服务器身份验证模式。无论使用哪种模式,都可以通过审核来跟踪访问SQL Server 2008的用户,默认时仅审核失败的登录。
当启用审核后,用户的登录被记录于Windows应用程序日志、SQL Server 2008错误日志或两种之中,这取决于如何配置SQL Server 2008的日志。可用的审核选项如下:
l 无 禁止跟踪审核
l 仅限失败的登录 默认设置,选择后仅审核失败的登录尝试。
l 仅限成功的登录 仅审核成功的登录尝试。
l 失败和成功的登录 审核所有成功和失败的登录尝试。
9.2.2 管理登录帐号
与两种验证模式一样,服务器登录也有两种情况:可用使用域账号登录,域账号可用是域或本地用户账号、本地组账户或通用的和全局的域组账户;可用通过指定唯一的登录ID和密码来创建SQL Server 2008登录,默认登录包括本地管理员组、本地管理员、sa、Network Service和SYSTEM。
l 系统管理员组 SQL Server 2008中管理员组在数据库服务器上属于本地组。这个组的成员通常包括本地管理员用户账户和任何设置为管理员本地系统的其他用户。在SQL Server 2008中,此组默认授予sysadmin服务器角色。
l 管理员用户账户 管理员在SQL Server 2008服务器上的本地用户账户。该账户提供对本地系统的管理权限,主要在安装系统时使用它。如果计算机是Windows域的一部分,管理员账户通常也有域范围的权限。在SQL Server 2008中,这个账户默认授予sysadmin服务器角色。
l Sa登录 是SQL Server系统管理员的账户。而在SQL Server 2008中采用了新的集成和扩展的安全模式,sa不再是必需的,提供此登录账户主要是为了针对以前SQL Server版本的向后兼容性。与其他管理员登录一样,sa默认授予sysadmin服务器角色。在默认安装SQL Server 2008的时候,sa账户没有被指派密码。
如果要组织非授权访问服务器,可以为sa账户设置一个密码,而且应该像Windows账户密码那样,周期性地进行修改。 |
l Network Service和SYSTEM登录 它是SQL Server 2008服务器上内置的本地账户,而是否创建这些账户的服务器登录,依赖于服务器的配置。例如,如果已经将服务器配置为报表服务器,此时将有一个NETWORK SERVICE的登录账户,这个登录将是mester、msdb、ReportServer和ReportServerTempDB数据库的特殊数据库角色RSExceRole的成员。
在服务器实例设置期间,NETWORK SERVICE和SYSTEM账户可以是为SQL Server、SQL Server代理、分析服务和报表服务器所选择的服务账户。在这种情况下,SYSTEM账户通常具有sysadmin服务器和角色,允许其完全访问以管理服务器实例。
只有获得Windows账户的客户才能建立与SQL Server 2008的信任连接(即SQL Server 2008委托Windows验证用户的密码)。如果正在为其创建登录的用户(比如Novell客户)无法建立信任连接,则必须为他们创建SQL Server账户登录。下面来创建两个标准登录,以供后面使用。具体操作过程如下。
(1)打开Microsoft SQL Server Management Studio,展开【服务器】节点,然后展开【安全性】节点。
(2)右击【登录名】节点,从弹出的菜单中选择【新建登录名】命令,将打开【登录名-新建】窗口,然后输入登录名为shop_Manage,同时,选择【SQL Server身份验证】单选按钮,并设置密码,如图9-6所示。
图9-6 创建SQL Server 登录账户
(4)单击【确定】按钮,完成SQL Server 登录账户的创建。
为了测试创建的登录名是否成功,下面用新的登录名shop_Manage来进行测试,具体步骤如下所示:
(1)在SQL Server Management Studio中,单击【连接】|【数据库引擎】命令,将打开【连接到服务器】窗口。
(2)从【身份验证】下拉表中,选择【SQL Server身份验证】选项,【登录名】文本框中输入shop_Manage,【密码】文本框输入相应的密码,如图9-7所示。
图9-7 连接服务器
(3)单击【连接】按钮,登录服务器,如图9-8所示。
图9-8 使用shop_Manage登录成功 图9-9 无法访问数据库
但是由于默认的数据库是master数据库,所有其他的数据库没有权限访问。这里访问“网店购物系统”数据库,就会提示错误信息,如图9-9所示。
9.2.3 管理用户
要访问特定的数据库,还必须具有用户名。用户名在特定的数据库内创建,并关联一个登录名(当一个用户创建时,必须关联一个登录名)。通过授权给用户来指定用户可以访问的数据库对象的权限。可以这样想象,假设SQL Server是一个包含许多房间的大楼,每一个房间代表一个数据库,房间里的资料可以表示数据库对象。则登录名就相当于进入大楼的钥匙,而每个房间的钥匙就是用户名。房间中的资料则可以根据用户名的不同而有不同的权限。
在上一节中,我们介绍了创建登录账户。而创建的登录账户将不为该登录账户映射相应的数据库用户,所以该登录账户无法访问数据库。一般情况下,用户登录SQL Server实例后,还不具备访问数据库的条件。在用户可以访问数据库之前,管理员必须为该用户在数据库中建立一个数据库账号作为访问该数据库的ID。这个过程就是将SQL Server登录账号映射到需要访问的每个数据库中,这样才能够访问数据库。如果数据库中没有用户账户,则即使用户能够连接到SQL Server实例也无法访问到该数据库。
下面通过使用SQL Server Management Studio来创建数据库用户账户,然后给用户授予访问数据库“网店购物系统”的权限。具体步骤如下所示:
(1)打开SQL Server Management Studio,并展开【服务器】节点。
(2)展开【数据库】节点,然后再展开“网店购物系统”节点。
(3)再展开【安全性】节点,右击【用户】节点,从弹出菜单中选择【新建用户】命令,打开【数据库用户-新建】窗口。
(4)单击【登录名】文本框旁边的【选项】按钮 ,打开【选择登录名】窗口,然后单击【浏览】按钮,打开【查找对象】窗口,选择刚刚创建的SQL Server登录账户shop_Manage,如图9-10所示。
图9-10 选择登录账户
(5)单击【确定】按钮返回,在【选择登录名】对话框就可以看到选择的登录名对象,如图9-11所示。
图9-11 【选择登录名】对话框
(6)单击【确定】按钮返回。设置用户名为WD,选择架构为dbo,并设置用户的角色为db_owner,具体设置如图9-12所示。
图9-12 新建数据库用户
(7)单击【确定】按钮,完成数据库用户的创建。
(8)为了验证是否创建成功,可以刷新【用户】节点,用户就可以看到刚才创建的WD用户账户,如图9-13所示。
图9-13 查看【用户】节点
数据库用户创建成功后,就可以使用该用户关联的登录名shop_Manage进行登录,就可以访问“网店购物系统”的所有内容,如图9-14所示。
图9-14 查看【场馆信息】表
添加数据库用户还可以用系统存储过程sp_grantdbaccess来实现,具体语法是:
CREATE USER user_name
[ { { FOR | FROM }
{
LOGIN login_name
| CERTIFICATE cert_name
| ASYMMETRIC KEY asym_key_name
}
| WITHOUT LOGIN
]
[ WITH DEFAULT_SCHEMA = schema_name ]
其中语法的参数介绍如下:
l user_name 指定在此数据库中用于识别该用户的名称。user_name是sysname。他的长度最多是128个字符。
l LOGIN login_name 指定要创建数据库用户的SQL Server登录名。login_name必须是服务器中有效的登录名。当此SQL Server登录名进入数据库时,他将获取正在创建的数据库用户的名称和ID。
l CERTIFICATE cert_name 指定要创建数据库用户的证书。
l ASYMMETRIC KEY asym_key_name 指定要创建数据库用户的非对称密钥。
l WITH DEFAULT_SCHEMA = schema_name 指定服务器为此数据库用户解析对象名时将搜索的第一个架构。
l WITHOUT LOGIN 指定不应将用户映射到现有登录名。
下面的例子建立了一个SQL Server的登录账户,然后将该账户添加为“网店购物系统”数据库的用户。
USE master
GO
CREATE LOGIN admin
WITH PASSWORD = 'admini_strator';
USE 网店购物系统
CREATE USER admin FOR LOGIN admin;
GO
执行上述语句,就为“网店购物系统”数据库创建了一个名字为admin的用户,如图9-15所示。
图9-15 查看数据库用户
使用系统存储过程创建SQL Server登录时候,密码要符合SQL Server 2008的密码策略,如果密码过于简单,将无法创建账户。 |
9.3 管理角色
角色是SQL Server 2008用来集中管理数据库或者服务器的权限。数据库管理员将操作数据库的权限赋予角色。然后,数据库管理员再将角色赋给数据库用户或者登录账户,从而使数据库用户或者登录账户拥有了相应的权限。
9.3.1 固定服务器角色
为便于管理服务器上的权限,SQL Server提供了若干“角色”,这些角色是用于分组其他主体的安全主体。“角色”类似于Microsoft Windows操作系统中的“组”。
服务器级角色也称为“固定服务器角色”,因为不能创建新的服务器级角色。服务器级角色的权限作用域为服务器范围。可以向服务器级角色中添加SQL Server登录名、Windows账户和Windows组。固定服务器角色的每个成员都可以向其所属角色添加其他登录名。
用户可以指派给这8个服务器角色之中的任意一个角色。下面将分别介绍这8个服务器角色:
l sysadmin 这个服务器角色的成员有权在SQL Server 2008中执行任何任务。不熟悉SQL Server 2008的用户可能会意外地造成严重问题,所以给这个角色批派用户时应该特别小心。通常情况下,这个角色仅适合数据库管理员(DBA)。
l securityadmin 这个服务器角色的成员将管理登录名及其属性。他们可以GRANT、DENY和REVOKE服务器级权限。也可以GRANT、DENY和REVOKE数据库级权限。另外,他们可以重置SQL Server 2008登录名的密码。
l serveradmin 这个服务器角色的成员可以更改服务器范围的配置选项和关闭服务器。比如SQL Server 2008可以使用多大内存或者关闭服务器,这个角色可以减轻管理员的一些管理负担。
l setupadmin 这个服务器角色的成员可以添加和删除链接服务器,并且也可以执行某些系统存储过程。
l processadmin SQL Server 2008能够多任务化,也就是说,他可以通过执行多个进程做多件事件。例如,SQL Server 2008可以生成一个进程用于向高速缓存写数据,同时生成另一个进程用于从高速缓存中读取数据。这个角色的成员可以结束(在SQL Server 2008中称为删除)进程。
l diskadmin 这个服务器角色用于管理磁盘文件,比台镜像数据库和添加备份设备。这适合于助理DBA。
l dbcreator 这个服务器角色的成员可以创建、更改、删除和还原任何数据库。这不仅是适合助理DBA的角色,也可能是个适合开发人员的角色。
l bulkadmin 这个服务器角色的成员可以运行BULK INSERT语句。这条语句允许他们从文本文件中将数据导入到SQL Server 2008数据库中。
在SQL Server 2008中可以使用系统存储过程对固定服务器角色进行相应的操作,表9-3就列出了可以对服务器角色进行操作的各个存储过程。
表9-3 使用服务器角色的操作
功能 |
类型 |
说明 |
sp_helpsrvrole |
元数据 |
返回服务器级角色的列表 |
sp_helpsrvrolemember |
元数据 |
返回有关服务器级角色成员的信息 |
sp_srvrolepermission |
元数据 |
显示服务器级角色的权限 |
IS_SRVROLEMEMBER |
元数据 |
指示SQL Server登录名是否为指定服务器级角色的成员 |
sys.server_role_members |
元数据 |
为每个服务器级角色的每个成员返回一行 |
sp_addsrvrolemember |
命令 |
将登录名添加为某个服务器级角色的成员 |
sp_dropsrvrolemember |
命令 |
从服务器级角色中删除SQL Server登录名或者Windows用户或者组 |
例如,想要查看所有的固定服务器角色,就可以使用系统存储过程sp_helpsrvrole,具体的执行过程及结果如图9-16所示。
图9-16 查看固定服务器角色
下面将运用上面介绍的知识,将一些用户指派给固定服务器角色,进而分配给他们相应的管理权限。具体步骤如下所示:
(1)打开SQL Server Management Studio,在【对象资源管理器】窗口,展开【安全性】节点,然后再展开【服务器角色】节点。
(2)双击sysadmin节点,打开【服务器角色属性】节点,然后单击【添加】按钮,打开【选择登录名】窗口。
(3)单击【浏览】按钮,打开【查找对象】对话框,启用shop_Manage选项旁边的复选框,如图9-17所示。
图9-17 添加登录名
(4)单击【确定】按钮返回到【选择登录名】对话框,就可以看到刚刚添加的登录名shop_Manage,如图9-18所示。
图9-18 【选择登录名】对话框
(5)单击【确定】按钮返回【服务器角色属性】窗口,在角色成员列表中,就可以看到服务器角色sysadmin的所有成员,其中包括刚刚添加的shop_Manage,如图9-19所示。
图9-19 【服务器角色属性】窗口
(6)用户可以再次通过【添加】按钮添加新的登录名,也可以通过【删除】按钮删除某些不需要的登录名。
(7)添加完成后,单击【确定】按钮关闭【服务器角色属性】窗口。
9.3.2 固定数据库角色
固定数据库角色存在于每个数据库中,在数据库级别提供管理特权分组。管理员可将任何有效的数据库用户添加为固定数据库角色成员。每个成员都获得应用于固定数据库角色的权限。用户不能增加、修改和删除固定数据库角色。
SQL Server 2008在数据库级设置了固定数据库角色来提供最基本的数据库权限的综合管理。在数据库创建时,系统默认创建了10个固定数据库角色,下面将分别介绍这几个固定数据库角色:
l db_owner 进行所有数据库角色的活动,以及数据库中的其他维护和配置活动。该角色的权限跨越所有其他的固定数据库角色。
l db_accessadmin 这些用户有权通过添加或者删除用户来指定谁可以访问数据库。
l db_securityadmin 这个数据库角色的成员可以修改角色成员身份和管理权限。
l db_ddladmin 这个数据库角色的成员可以在数据库中运行任何数据定义语言(DDL)命令。这个角色允许他们创建、修改或者删除数据库对象,而不必浏览里面的数据。
l db_backupoperator 这个数据库角色的成员可以备份该数据库。
l db_datareader 这个数据库角色的成员可以读取所有用户表中的所有数据。
l db_datawriter 这个数据库角色的成员可以在所有用户表中添加、删除或者更改数据。
l db_denydatareader 这个服务器角色的成员不能读取数据库内用户表中的任何数据,但可以执行架构修改(比如在表中添加列)。
l db_denydatawriter 这个服务器角色的成员不能添加、修改或者删除数据库内用户表中的任何数据。
l public 在SQL Server 2008中每个数据库用户都属于public数据库角色。当尚未对某个用户授予或者拒绝对安全对象的特定权限时,则该用户将继承授予该安全对象的public角色的权限。这个数据库角色不能补删除。
在SQL Server 2008中可以使用Transact-SQL语句对固定数据库角色进行相应的操作,表9-4就列出了可以对服务器角色进行操作的系统存储过程和命令等。
表9-4 数据库角色的操作
功能 |
类型 |
说明 |
sp_helpdbfixedrole |
元数据 |
返回固定数据库角色的列表 |
sp_dbfixedrolepermission |
元数据 |
显示固定数据库角色的权限 |
sp_helprole |
元数据 |
返回当前数据库中有关角色的信息 |
sp_helprolemember |
元数据 |
返回有关当前数据库中某个角色的成员的信息 |
sys.database_role_members |
元数据 |
为每个数据库角色的每个成员返回一行 |
IS_MEMBER |
元数据 |
指示当前用户是否为指定Microsoft Windows组或者Microsoft SQL Server数据库角色的成员 |
CREATE ROLE |
命令 |
在当前数据库中创建新的数据库角色 |
ALTER ROLE |
命令 |
更改数据库角色的名称 |
DROP ROLE |
命令 |
从数据库中删除角色 |
sp_addrole |
命令 |
在当前数据库中创建新的数据库角色 |
sp_droprole |
命令 |
从当前数据库中删除数据库角色 |
sp_addrolemember |
命令 |
为当前数据库中的数据库角色添加数据库用户、数据库角色、Windows登录名或者Windows组 |
sp_droprolemember |
命令 |
从当前数据库的SQL Server角色中删除安全账户 |
例如,使用系统存储过程sp_helpdbfixedrole就可以返回固定数据库角色的列表,如图9-20所示。
图9-20 查看固定数据库角色
由于所有数据库用户都自动成为public数据库角色的成员,因此给这个数据库角色指派权限时需要谨慎。 |
下面通过将用户添加到固定数据库角色中来配置他们对数据库拥有的权限,具体步骤如下所示:
(1)打开SQL Server Management Studio,在【对象资源管理器】窗口,展开【数据库】节点,然后再展开数据库【网店购物系统】节点中的【安全性】节点。
(2)接着展开【角色】节点,然后再展开【数据库角色】节点,双击db_owner节点,打开【数据库角色属性】窗口。
(3)单击【添加】按钮,打开【选择数据库用户或角色】对话框,然后单击【浏览】按钮打开【查找对象】对话框,选择数据库用户admin,如图9-21所示。
图9-21 添加数据库用户
(4)单击【确定】按钮返回【选择数据库用户或角色】对话框。如图9-22所示。
图9-22 【选择数据库用户或角色】对话框
(5)单击【确定】按钮,返回【数据库角色属性】窗口,在这里可以看到当前角色拥有的架构以及该角色所有的成员,其中包括刚添加的数据库用户admin,如图9-23所示。
图9-23 【数据库角色属性】窗口
(6)添加完成后,单击【确定】按钮关闭【数据库角色属性】窗口。
9.3.3 应用程序角色
应用程序角色是一个数据库主体,他使应用程序能够用其自身的、类似用户的特权来运行。使用应用程序角色,可以只允许通过特定应用程序连接的用户访问特定数据。与数据库角色不同的是,应用程序角色默认情况下不包含任何成员,而且不活动。应用程序角色使用两种身份验证模式,可以使用sp_setapprole来激活,并且需要密码。因为应用程序角色是数据库级别的主体,所以他们只能通过其他数据库中授予guest用户账户的权限来访问这些数据库。因此,任何已禁用guest用户账户的数据库对其他数据库中的应用程序角色都不可访问。
创建应用程序角色的过程与创建数据库角色的过程一样,图9-24为应用程序角色的创建窗口。
图9-24 创建应用程序角色
应用程序角色和固定数据库角色的区别有如下4点:
l 应用程序角色不包含任何成员。不能将Windows组、用户和角色添加到应用程序角色。
l 当应用程序角色被激活以后,这次服务器连接将暂时失去所有应用于登录账户、数据库用户等的权限,而只拥有与应用程序相关的权限。在断开本次连接以后,应用程序失去作用。
l 默认情况下,应用程序角色非活动,需要密码激活。
l 应用程序角色不使用标准权限。
9.3.4 用户自定义角色
有时,固定数据库角色可能不满足需要。例如,有些用户可能只需数据库的“选择”、“修改”和“执行”权限。由于固定数据库角色之中没有一个角色能提供这组权限,所以需要创建一个自定义的数据库角色。
在创建数据库角色进,先给该角色指派权限,然后将用户指派给该角色;这样,用户将继承给这个角色指派的任何权限。这不同于固定数据库角色,因为在固定角色中不需要指派权限,只需要添加用户。创建自定义数据库角色的步骤如下所示:
(1)打开SQL Server Management Studio,在【对象资源管理器】窗口,展开【数据库】|【网店购物系统】|【安全性】|【角色】节点,右击【数据库角色】节点从弹出菜单中选择【新建数据库角色】命令,打开【数据库角色-新建】窗口。
(2)设置角色名称为TestRole,所有者选择dbo,单击【添加】按钮,选择数据库用户admin,如图9-25所示。
图9-25 【数据库角色-新建】窗口
(3)选中【安全对象】选项,打开【安全对象】选项页面,通过单击【搜索】按钮,添加“商品信息”表为“安全对象”,选中【选择】后面【授予】列的复选框,如图9-26所示。
图9-26 为角色分配权限
(4)单击【列权限】按钮,还可以为该数据角色配置表中每一列的具体权限,如图9-27所示。
图9-27 分配列权限
(5)具体的权限分配完成后,单击【确定】按钮创建这个角色,并返回到SQL Server Management Studio。
(6)关闭所有程序,并重新登录为admin。
(7)展开【数据库】|【网店购物系统】|【表】节点,可以看到表节点下面只显示了拥有查看权限的【商品信息】表。
(8)由于在【列权限】窗口设置该角色的权限为:不允许查看【商品信息】表中的“商品价格”列,那么在查询视图中输入下列语句将出现错误,如图9-29所示。
图9-29 使用SELECT语句验证权限
9.4 管理架构
架构是对象的容器,用于在数据库内定义对象的命名空间。他们用于简化管理和创建可以共同管理的对象子集。架构与用户分离,用户拥有架构,并且当服务器在查询中解析非限定对象时,总是有一个默认的架构提供服务器使用。这意味着访问默认架构中的对象时,不需要指定架构名称。要访问其他架构中的对象时,需要两部分或者三部分的标识符。两部分的标识符指定架构名称和对象名称,格式为schema_name.object_name;三部分的标识符指定数据库的名称、架构名称和对象名称,格式为database_name.schema_name.object_name。
架构有很多好处。因为用户不再是对象的直接所有者,从数据库中删除用户是非常简单的任务,不再需要在删除创建对象的用户之前重命名对象。多个角色可以通过在角色或者Windows组中的成员资格来拥有单个架构,这样使得管理表、试图和其他数据库定义的对象变得简单的多,并且,多个用户可以共享单个默认架构,这样就使得授权访问共享对象变得更加容易。
9.4.1 创建架构
在创建表之前,应该谨慎地考虑架构的名称。架构的名称可以长达128个字符。架构的名称必须以英文字母开头,在名称中间可以包含下划线“_”、@符号、#符号和数字。架构名称在每个数据库中必须是唯一的。在不同的数据库中可以包含类似名称的架构,比如,两个不同的数据库可能的都拥有一个名为Admins的架构。
创建架构的方法有两种:使用图形化界面创建和使用Transact-SQL命令创建。
1.使用图形化界面创建架构
在SQL Server Management Studio工具中,可以通过下面的步骤来创建一个新的架构:
(1)在SQL Server Management Studio中,连接到包含默认的数据库的服务器实例。
(2)在【对象资源管理器】中,展开【服务器】|【数据库】|【体育场管理系统】|【安全性】节点,右击【架构】节点,在弹出的菜单中选择【新建架构】命令,显示【新建-架构】窗口,如图9-30所示。
图9-30 【新建-架构】窗口
(3)在【常规】页面,可以指定架构的名称以及设置架构的所有者。单击【搜索】按钮打开【搜索角色和用户】对话框,如图9-31所示。
图9-31 搜索角色和用户
(4)在【搜索角色和用户】对话框中,单击【浏览】按钮,打开【查找对象】对话框。在【查找对象】对话框中选择架构的所有者,可以选择当前系统的所有用户或者角色,如图9-32所示。
图9-32 查找对象
(5)选择完成后,单击【确定】按钮就可以完成架构的创建。
要指定另一个用户作为所创建架构的所有者,必须拥有对该用户的IMPERSONATE权限。如果一个数据库角色被指定作为所有者,当前用户必须是角色的成员,并且拥有对角色的ALTER权限。 |
2.使用Transact-SQL命令创建架构
除了使用图形化界面创建架构,还可以使用Transact-SQL命令来创建一个架构,创建架构的具体语法格式如下所示:
CREATE SCHEMA schema_name_clause [ <schema_element> [ ...n ] ]
<schema_name_clause> ::=
{
schema_name
| AUTHORIZATION owner_name
| schema_name AUTHORIZATION owner_name
}
<schema_element> ::=
{
table_definition | view_definition | grant_statement
revoke_statement | deny_statement
}
上述语法格式中的各参数说明如下:
l schema_name 在数据库内标识架构的名称。
l AUTHORIZATION owner_name 指定将拥有架构的数据库级主体的名称。此主体还可以拥有其他架构,并且可以不使用当前架构作为其默认架构。
l table_definition 指定在架构内创建表的CREATE TABLE语句。执行此语句的主体必须对当前数据库具有CREATE TABLE权限。
l view_definition 指定在架构内创建视图的CREATE VIEW语句。执行此语句的主体必须对当前数据库具有CREATE VIEW权限。
l grant_statement 指定可对除新架构外的任何安全对象授予权限的GRANT语句。
l revoke_statement 指定可对除新架构外的任何安全对象撤消权限的REVOKE语句。
l deny_statement 指定可对除新架构外的任何安全对象拒绝授予权限的DENY语句。
例如,创建一个名称为Admins的架构,就可以使用如下代码:
CREATE SCHEMA Admins AUTHORIZATION dbo
9.4.2 修改架构
有时候,如果所有者不能使用架构作为默认的架构,也可能想允许或者拒绝基于在每个用户或者每个角色上指定的权限,那么就需要更改架构的所有权或者修改他的权限。需要注意的是,架构在创建之后,就不能更改架构的名称,除非删除该架构,然后使用新的名称创建一个新的架构。
在SQL Server Management Studio工具中,可以更改架构的所有者。具体步骤如下所示:
(1)在SQL Server Management Studio中,连接到包含默认的数据库的服务器实例。
(2)在【对象资源管理器】中,展开【服务器】|【数据库】|【体育场管理系统】|【安全性】|【架构】节点,找到上面所创建的名称为Admins的架构。右击该节点,从弹出菜单中选择【属性】命令,打开【架构属性】窗口,如图9-33所示。
图9-33 架构属性窗口
(3)单击【搜索】按钮就可以打开【搜索角色和用户】对话框,然后单击【浏览】按钮,在【查找对象】对话框中选择想要修改的用户或者角色,然后单击【确定】按钮两次,完成对架构所有者的修改。
用户还可以在【架构属性】窗口的【权限】页面中管理架构的权限。所有在对象上被直接地指派权限的用户或者角色都会显示在【用户或角色】列表中,通过下面的步骤,就可以配置用户或者角色的权限。
(1)在【架构属性】窗口中,选择【权限】页面。
(2)在【权限】页面,单击搜索,添加用户。
(3)添加用户完成后,在【用户或角色】列表中选择用户,并在下面的权限列表中,启用相应的复选框的选项,就可以完成对用户的权限的配置,如图9-34所示。
图9-34 配置用户的权限
(4)设置完成,单击【确定】按钮完成配置。
9.4.3 移动对象到新的架构
在前面提到,架构是对象的容器,有时候希望把对象从一个容器移动到另一个容器,需要注意的是只有在同一数据库内的对象才可以从一个架构移动到另一个架构。
移动对象到一个新的架构会更改与对象相关联的命名空间,也会更改对象查询和访问的方式。
移动对象到新的架构也会影响对象的权限。当对象移动到新的架构中时,所有对象上的权限都会被删除。如果对象的所有者设置为特定的用户或者角色,那么该用户或者角色将继续成为对象的所有者。如果对象的所有者设置为SCHEMA OWNER,所有权仍然为SCHEMA OWNER所有,并且移动后,所有者将变成新架构的所有者。
要在架构之间移动对象,必须拥有对对象的CONTROL权限以及对对象的目标架构的ALTER权限。如果对象上有“EXECUTE AS OWNER(以所有者执行)”的具体要求,并且所有者设置为SCHEMA OWNER,则必须也拥有对目标架构的所有者的INPERSONATION权限。 |
在SQL Server Management Studio工具中,移动对象到新的架构中,可以使用如下具体步骤:
(1)在SQL Server Management Studio中,连接到包含默认的数据库的服务器实例。
(2)在【对象资源管理器】中,展开【服务器】|【数据库】|【体育场管理系统】|【表】节点,右击【客户信息】表,从弹出的菜单中选择【设计】命令,进入表设计器。
(3)在【视图】菜单中,选择【属性窗口】命令,打开【客户信息】表的属性窗口。
(4)在表的【属性】窗口中,在“标识”下单击“架构”下拉列表,选择目标架构。如图9-35所示。
图9-35 修改架构
(5)修改完成后,保存对表的修改,即可完成移动该对象到新的架构操作。
使用Transact-SQL命令的ALTER SCHEMA语句也可以完成移动对象到新的架构,具体的语法格式如下所示:
ALTER SCHEMA schema_name TRANSFER securable_name
上述语法格式各参数的说明如下:
l schema_name 当前数据库中的架构名称,安全对象将移入其中。其数据类型不能为SYS或INFORMATION_SCHEMA。
l securable_name 要移入架构中的架构包含安全对象的一部分或两部分名称。
例如,将【客户信息】表从当前架构dbo中移动到目标架构Admins中,就可以使用如下代码:
ALTER SCHEMA Admins TRANSFER dbo.客户信息;
GO
9.4.4 删除架构
如果不在需要一个架构,那么就可以删除该架构,把他从数据库中清除掉。要删除一个架构,首先必须在架构上拥有CONTROL的权限,并且在删除架构之前,移动或者删除该架构说包含的所有对象,否则删除操作将会失败。
在SQL Server Management工具中删除一个架构,就可以通过以下步骤来实现:
(1)在SQL Server Management Studio中,连接到包含默认的数据库的服务器实例。
(2)在【对象资源管理器】中,展开【服务器】|【数据库】|【体育场管理系统】|【安全性】|【架构】节点,找到前面创建的名称为Admins的架构。
(3)右击该架构,在弹出的菜单中选择【删除】命令,调出【删除对象】对话框,单击【确定】按钮就可以完成删除操作。
同样,使用Transact-SQL命令的DROP SCHEMA语句也可以完成对架构的删除操作,具体语法格式如下所示:
DROP SCHEMA schema_name
其中,schema_name表示架构在数据库中所使用的名称。
例如删除名称为Admins的架构,就可以使用如下代码:
DROP SCHEMA Admins
当删除架构时候,请确保正在使用正确的数据库,并且没有使用master数据库。 |
9.5 管理权限
数据库权限指明用户获得哪些数据库对象的使用权,以及用户能够对这些对象执行何种操作。用户在数据库中拥有的权限取决于以下两方面的因素:
l 用户账户的数据库权限
l 用户所在角色的类型
权限提供了一种方法来对特权进行分组,并控制实例、数据库和数据库对象的维护和实用程序的操作。用户可以具有授予一组数据库对象的全部特权的管理权限,也可以具有授予管理系统的全部特权但不允许存取数据的系统权限。
9.5.1 对象权限
在SQL Server 2008中,所有对象权限都可以授予。可以为特定的对象、特定类型的所有对象和所有属于特定架构的对象管理器。
在服务器级别,可以为服务器、端点、登录和服务器角色授予对象权限。也可以为当前的服务器实例管理权限;在数据库级别,可以为应用程序角色、程序集、非对称密钥、凭据、数据库角色、数据库、全文目录、函数、架构等管理权限。
一旦有了保存数据的结构,就需要给用户授予开始使用数据库中数据的权限,可以通过给用户授予对象权限来实现。利用对象权限,可以控制谁能够读取、写入或者以其他方式操作数据。下面简要介绍12个对象权限:
l Control 这个权限提供对象及其下层所有对象上的类似于主所有权的能力。例如,如果给用户授予了数据库上的“控制”权限,那么他们在该数据库内的所有对象(比如表和视图)上都拥有“控制”权限。
l Alter 这个权限允许用户创建(CREATE)、修改(ALTER)或者删除(DROP)受保护对象及其下层所有对象。他们能够修改的惟一属性是所有权。
l Take Ownership 这个权限允许用户取得对象的所有权。
l Impersonate 这个权限允许一个用户或者登录模仿另一个用户或者登录。
l Create 这个权限允许用户创建对象。
l View Definition 这个权限允许用户查看用来创建受保护对象的T-SQL语法。
l Select 当用户获得了选择权限时,该权限允许用户从表或者视图中读取数据。当用户在列级上获得了选择权时,该权限允许用户从列中读取数据。
l Insert 这个权限允许用户在表中插入新的行。
l Update 这个权限允许用户修改表中的现有数据,但不允许添加或者删除表中的行。当用户在某一列上获得了这个权限时,用户只能修改该列中的数据。
l Delete 这个权限允许用户从表中删除行。
l References 表可以借助于外部关键字关系在一个共有列上相互链接起来;外部关键字关系设计用来保护表间的数据。当两个表借助于外部关键字链接起来时,这个权限允许用户从主表中选择数据,即使他们在外部表上没有“选择”权限。
l Execute 这个权限允许用户执行被应用了该权限的存储过程。
9.5.2 语句权限
语句权限是用于控制创建数据库或者数据库中的对象所涉及的权限。例如,如果用户需要在数据库中创建表,则应该向该用户授予CREATE TABLE语句权限。某些语句权限(如CREATE DATABASE)适用于语句自身,而适用于数据库中定义的特定对象。只有sysadmin、db_owner和db_securityadmin角色的成员才能够授予用户语句权限。
在SQL Server 2008中的语句权限主要有:
l CREATE DATABASE 创建数据库
l CREATE TABLE 创建表
l CREATE VIEW 创建视图
l CREATE PROCEDURE 创建过程
l CREATE INDEX 创建索引
l CREATE ROLE 创建规则
l CREATE DEFAULT 创建默认值
可以使用SQL Server Management Studio授予语句权限,例如为角色TestRole授予CREATE TABLE权限,而不授予SELECT权限,然后执行相应的语句,查看执行结果,从而理解语句权限的设置。具体步骤如下所示:
(1)打开SQL Server Management Studio,在【对象资源管理器】中展开【服务器】节点,然后再展开【数据库】节点。
(2)然后,右击数据库【体育场管理系统】,从弹出菜单中选择【属性】命令,打开【数据库属性】窗口。
(3)选中【权限】选项,打开【权限】选项页面,从【用户或角色】列表中单击选中TestRole。
(4)在【TestRole的显示权限】列表中,启用CREATE TABLE后面【授予】列的复选框,而SELECT后面的【授予】列的复选框一定不能启用。如图9-36所示。
图9-36 配置【权限】页面
(5)设置完成后,单击【确定】按钮返回SQL Sever Management Studio。
(6)断开当前SQL Server服务器的连接,重新打开SQL Sever Management Studio,设置验证模式为SQL Server身份验证模式,使用admin登录,由于该登录账户于数据库用户admin相关联,而数据库用户admin是TestRole的成员,所以该登录账户拥有该角色的所有权限。
(7)单击【新建查询】命令,打开查询视图。查看【体育场管理系统】数据库中的客户信息,结果将会失败,如图9-37所示。
图9-37 SELECT语句执行结果
(8)消除当前查询窗口的语句,并输入REATE TABLE语句创建表,具体代码如下所示:
USE 体育场管理系统
GO
CREATE TABLE 赛事安排
(比赛编号 int NOT NULL,
赛事名称 nvarchar(50) NOT NULL,
比赛时间 datetime NOT NULL,
场馆编号 int NOT NULL
)
(9)执行上述语句,显示成功。因为用户admin拥有创建表的权限,所以登录名admin继承了该权限。
其实上面的授予语句权限工作完全可以用GRANT语句来完成,具体语句如下所示:
GRANT {ALL | statement[,…n]}
TO security_account[,…n]
上述语法中各参数描述如下所示:
l ALL 该参数表示授予所有可以应用的权限。在授予语句权限时,只有固定服务器角色sysadmin成员可以使用ALL参数。
l statement 表示可以授予权限的命令,如CREATE TABLE等。
l security_account 定义被授予权限的用户单位。security_account可以是SQL Server 2008的数据库用户或者角色,也可以是Windows用户或者用户组。
例如使用GRANT语句完成前面使用SQL Server Management Studio完成的为角色TestRole授予CREATE TABLE权限,就可以使用如下代码:
USE 体育场管理系统
GO
GRANT CREATE TABLE
TO TestRole
9.5.3 删除权限
通过删除某种权限可以停止以前授予或者拒绝的权限。使用REVOKE语句删除以前的授予或者拒绝的权限。删除权限是删除已授予的权限,并不是妨碍用户、组或者角色从更高级别集成已授予的权限。
撤销对象权限的基本语法如下:
REVOKE [GRANT OPTION FOR]
{ALL[PRIVILEGES]|permission[,...n]}
{
[(column[,...n])]ON {table|view}|ON{table|view}
[(column[,...n])]
|{stored_procedure}
}
{TO|FROM}
security_account[,...n]
[CASCADE]
撤销语句权限的语法是:
REVOKE {ALL|statement[,...n]}
FROM security_account[,...n]
其中对各个参数的介绍如下:
l ALL 表示授予所有可以应用的权限。其中在授予命令权限时,只有固定的服务器角色sysadmin成员可以使用ALL关键字;而在授予对象权限时,固定服务器角色成员sysadmin、固定数据库角色db_owner成员和数据库对象拥有者都可以使用关键字ALL
l statement 表示可以授予权限的命令。例如,CREATE DATABASE。
l permission 表示在对象上执行某些操作的权限
l column 在表或者视图上允许用户将权限局限到某些列上,column表示列的名字
l WITH GRANT OPTION 指示被授权者在获得指定权限的同时还可以将指定权限授予其他主体
l security_account 定义被授予权限的用户单位。security_account可以是SQL Server的数据库用户,可以是SQL Server的角色,也可以是Windows的用户或者工作组。
l CASCADE 指示要撤消的权限也会从此主体授予或者拒绝该权限的其他主体中撤消。
如果对授予了WITH GRANT OPTION权限的权限执行级联撤消,将同时撤消该权限的GRANT和DENY权限。 |
例如,删除角色TestRole对客户信息表的SELECT权限,就可以使用如下代码:
USE 体育场管理系统
GO
REVOKE SELECT ON 客户信息
FROM TestRole
GO
9.6 扩展练习
扩展练习9-1:创建证书 |
在数据库安全管理中,可以通过添加证书,然后再对数据库进行加密,以确保数据库的安全性。证书是一个数字签名的安全对象,其中包含 SQL Server 的公钥(还可以选择包含私钥)。用户可以使用外部生成的证书,也可以由 SQL Server 生成证书。
例如,在编辑器中,输入添加证书代码,并生成Shipping04证书,如图9-1所示。
图9-1 创建证书
在编辑中,输入的代码如下:
CREATE CERTIFICATE Shipping04
ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
WITH SUBJECT = 'Sammamish Shipping Records',
EXPIRY_DATE = '10/31/2012';
GO
其中,各语句的含意:
l CREATE CERTIFICATE 创建证书。
l ENCRYPTION BY PASSWORD 指定对从文件中检索的私钥进行解密所需的密码。
l SUBJECT 根据 X.509 标准中的定义,术语“主题”是指证书的元数据中的字段。主题的长度最多是 128 个字符。
l EXPIRY_DATE 证书过期的日期。如果未指定,则将 EXPIRY_DATE 设置为 START_DATE 一年之后的日期。
扩展练习9-2:更改SQL Server端口号 |
SQL Server的默认实例在TCP端口1433上侦听客户端请求,而SQL Server的命名实例在随机分配的端口号上进行侦听。
SQL Server的默认端口通信行为会引起以下两点安全问题:第一点,SQL Server的端口是众所周知的,而且 SQL Server解析服务已成为缓冲区溢出攻击和拒绝服务攻击(包括“Slammer”蠕虫病毒)的目标;第二点,如果数据库安装在SQL Server的命名实例上,则会随机分配相应的通信端口,而且此端口可能会改变。
因此,在强化的环境中,此行为可能会阻止服务器之间的通信。为保护服务器的环境,对开放、阻止、修改TCP端口是必不可少的。
(1)单击【开始】按钮,并执行【程序】|Microsoft SQL Server 2008|【配置工具】|【SQL Server配置管理器】命令,如图9-2所示。
图9-2 打开SQL Server配置管理器
(2)在Sql Server Configuration Manager窗口中,选择左侧的【MSSQLSERVER的协议】节点,如图9-3所示。
(3)右击右侧的【TCP/IP】选项,并执行【属性】命令,如图9-4所示。
图9-3 选择节点 图9-4 执行【属性】命令
(4)在弹出的【TCP/IP 属性】对话框中,选择【IP地址】选项卡,如图9-5所示。
(5)在第三项【TCP端口】选项中,修改后面1433修改为1043,并单击【应用】按钮,如图9-6所示。
图9-5 选择【IP地址】选项卡 图9-6 修改端口号
(6)在窗口的左侧,展开【SQL Native Client 10.0配置】节点,并选择【客户端协议】节点,如图9-7所示。
(7)再右击右侧的【TCP/IP】选项,并执行【属性】命令,如图9-8所示。
图9-7 选择【客户端协议】节点 图9-8 执行【属性】命令
(8)在弹出的【TCP/IP属性】对话框中,修改【默认端口】为1043,并单击【确定】按钮,如图9-9所示。
图9-9 修改端口号