技术开发 频道

详解SQL Server2012包含数据库优劣

  【IT168 评论】在SQL Server2012引入的诸多功能中,SQL Server2012包含数据库(Contained Database)可能是最具价值的功能之一。与典型的SQL Server数据库不同,SQL Server2012包含数据库与其所属的SQL Server实例相隔离,同样与在此实例上的其他数据库相隔离。这样的隔离使得管理数据库更为容易,尤其是在将它们迁移到一个不同的实例上或是用它们来实现一个故障转移集群的时候。

  在SQL Server2012之前,人们认为所有的SQL Server数据库都是非包含的。具体到数据库,元数据是游离于数据库之外的。服务器的默认排序规则可能会影响到对数据库的查询。而且数据库中的用户身份验证绑定在服务器级别上的登录,而这些登录是定义在实例上的。

  在SQL Server2012中,所有的数据库仍然默认是非包含的。尽管如此,你现在可以将任何非系统数据库配置为包含的。这样,元数据就会如其所述驻留在数据库内。另外,由于排序模型已经大为简化,所有的用户数据和临时数据会使用默认数据库排序规则,而且所有其他的对象(元数据、临时元数据、变量等)会使用目录排序,即Latin1_General_100_CI_AS_WS_KS_SC 是面向所有包含数据库的。

  SQL Server2012包含数据库所带来的最为重要的变化就是“包含用户”,即专门为包含数据库创建的一个用户账户。此账户没有绑定到服务器级别的登录并只提供了对包含数据库的访问,且不授权访问其他数据库或整体实例。

  SQL Server支持两类包含用户:

  有密码的数据库用户: 创建一个带有用户名和密码的本地数据库账户是允许在此数据库上进行身份验证的。

  Windows主体: A local database account based on a Windows user or group account but authenticated by the database.虽是一个基于Windows用户或组账户的本地数据库账户,但由数据库进行身份验证。

  你可以把任何一类或是将两类账户都添加到一个包含数据库。实际上,你仍然可以添加基于登录的账户。这是因为SQL Server2012支持所谓的“部分包含数据库”,而不是完全包含数据库。

  在一个完全的SQL Server2012包含数据库中,数据库之外不存在任何依赖性,比如一个服务代理路线或是基于登录的用户账户。但是部分包含数据库可以同时支持包含和非包含元素。这意味着,例如,你可以通过基于登录账户,或是包含用户账户或是通过两者提供对数据库的访问。但是,你仍可以通过去除任何非包含元素获得相当于一个完全包含的数据库。(SQL Server是否会逐渐支持完全包含数据库还需拭目以待。)

  SQL Server 2012包含数据库

  在你将SQL Server 2012包含数据库隔离之后,你就可以轻易将其从一个SQL Server实例迁移至另一个SQL Server实例,而不必迁移一组SQL Server登录。此包含数据库存储了数据库内所需的所有信息。这一过程也让设置你的高可用性集群变得更加容易。因为用户是直接连接到数据库的,所以如果发生故障转移,他们就可以很容易地连接到第二个数据库。

  即使你不将数据库进行迁移或集群化,SQL Server 2012包含数据库也能够让用户账户管理更为简单,因为你不用试图同时管理SQL Server登录和数据库用户账户。你可以授权特定用户访问特定数据库,而不用担心用户访问那些非授权项。

  然而在有众多优点的同时,缺点也与之共生。例如,包含数据库无法使用复制,变更跟踪或变更数据抓取。而且包含数据库会引发安全问题。比如,用户授予ALTER ANY USER权限会创建用户账户并授权访问数据库。此外,与包含用户账户关联的密码散列是存储在数据库中的,就使得他们更容易遭受字典攻击。另外,包含用户账户不能使用Kerberos身份验证,其只对于使用Windows 身份验证的SQL Server登录账户是可用的。

  尽管有这些局限性,如果对包含数据库加以精心实现,你还是可以规避一些安全问题并获得数据库隔离所带来的好处。SQL Server包含数据库提供了一个在之前的SQL Server中未曾见过的可移植性和可管理性级别。迁移数据库变得更加容易。故障转移也更为简便。访问管理同样变得更加容易。实际上,SQL Server 2012中的包含数据库功能对于任何想要简化其操作的组织来说可能都会有所裨益。

1
相关文章