在SQL Server 2012引入的诸多功能中,包含数据库(Contained Database)可能是最具价值的功能之一。与典型的SQL Server数据库不同,包含数据库与其所属的SQL Server实例相隔离,同样与在此实例上的其他数据库相隔离。这样的隔离使得管理数据库更为容易,尤其是在将它们迁移到一个不同的实例上或是用它们来实现一个故障转移集群的时候。
在SQL Server 2012之前,我们认为所有的SQL Server数据库都是非包含的。具体到数据库,元数据是游离于数据库之外的。服务器的默认排序规则可能会影响到对数据库的查询。而且数据库中的用户身份验证绑定在服务器级别上的登录,而这些登录是定义在实例上的。(都应该在master数据库内)。
在SQL Server 2012中,所有的数据库仍然默认是非包含的。尽管如此,我们现在可以将任何非系统数据库配置为包含的。这样,元数据就会如其所述驻留在数据库内。另外,由于排序模型已经大为简化,所有的用户数据和临时数据会使用默认数据库排序规则,而且所有其他的对象(元数据、临时元数据、变量等)会使用目录排序,即Latin1_General_100_CI_AS_WS_KS_SC 是面向所有包含数据库的。
SQL Server 2012包含数据库所带来的最为重要的变化就是“包含用户”,即专门为包含数据库创建的一个用户账户。此账户没有绑定到服务器级别的登录并只提供了对包含数据库的访问,且不授权访问其他数据库或整体实例。
实际上,我们仍然可以添加基于登录的账户。这是因为SQL Server2012支持所谓的“部分包含数据库”,而不是完全包含数据库。
在我们将SQL Server 2012包含数据库隔离之后,就可以轻易将其从一个SQL Server实例迁移至另一个SQL Server实例,而不必迁移一组SQL Server登录。此包含数据库存储了数据库内所需的所有信息。这一过程也让设置我们的高可用性集群变得更加容易。因为用户是直接连接到数据库的,所以如果发生故障转移,我们就可以很容易地连接到第二个数据库。
即使我们不将数据库进行迁移或集群化,SQL Server 2012包含数据库也能够让用户账户管理更为简单,因为我不用试图同时管理SQL Server登录和数据库用户账户。还可以授权特定用户访问特定数据库,而不用担心用户访问那些非授权项。
然而在有众多优点的同时,缺点也与之共生。例如,包含数据库无法使用复制,变更跟踪或变更数据抓取。此外,与包含用户账户关联的密码散列是存储在数据库中的,就使得他们更容易遭受字典攻击。
尽管有这些局限性,如果对包含数据库加以精心实现,我们你还是可以规避一些安全问题并获得数据库隔离所带来的好处。SQL Server包含数据库提供了一个在之前的SQL Server中未曾见过的可移植性和可管理性级别。迁移数据库变得更加容易。故障转移也更为简便。访问管理同样变得更加容易。实际上,SQL Server 2012中的包含数据库功能对于任何想要简化其操作的组织来说可能都会有所裨益。
小D笔记
好比公司里面不同部门(database)财务(Login)之前都统一交由财务处管理(master for Login Management),现在呢,有的部门准备另起炉灶了,自己设立了一个财务部门(User for Login),自主盈亏。所谓包含,我的东西还是自己揣兜里比较好啊。