SQL Server 2012新功能:数据库身份验证
【IT168 专稿】将您的数据从一个SQL Server实例移动到另一个实例,并不是一个少见的需求,可能是为了数据迁移,也可能是为了故障转移。问题是,有时需要些驻留在数据库外的数据,所以需要更多的开销而不仅仅是移动数据到一个新的实例;这意味着需要移动/恢复外部数据(比如登录数据等)到你的一个实例。听起来并不困难,但必须强调这是非常繁琐的并且出现任何失误哪怕是一个对象(存储于数据库外部的对象)都会影响你的应用按照预期执行。
SQL Server 2012(名称叫Denali)有一个叫做Contained Database Authentication的新功能,解决了上述问题并且为数据库管理者和应用程序开发者提供便利。
Contained Database Authentication(包含的数据库身份验证)
SQL Server 2012引入了一个叫做Contained Database Authentication的新功能,这个功能允许数据库部分包含存储在外部的数据。换句话说,一旦你在SQL Server实例级启用此功能,你能够建立一个用于存放用户信息和资格的数据库(而不是在主数据库中获取注册信息),所以当数据库迁移时不需要在目标实例上创建注册信息(做SID的映射)。令人欣慰。
除了上述好处,contained database提供了一个更好的功能。当你的服务排序规则和数据库不同时,临时对象将被contained database使用的而不是从服务器引出的排序规则所建立。之前必须使用COLLATE,现在这不是必须的了。
请注意:
·这适用于那些访问数据库但是在实例级不做任何系统管理的用户。
·部分包含的数据库无法使用诸如复制,数据变更捕获或变更跟踪等功能。
·部分包含的数据库中创建的用户对于主数据库和临时数据库有guest权限。
·此功能用于AlwaysOn以便更便于用户数据迁移。
·现在已有足够的理论,让我们围绕这一新功能做一些实际的应用。
开始Contained Database Authentication实例
SQL Server实例默认情况下不启用Contained Database Authentication。首先,你需要启用它,然后就可以创建with containment的数据库或是可以验证用户的数据库。有两种方法来启用此功能(不是使用PowerShell命令)。
第一种方法,使用sp_configure系统存储过程开启,脚本如下:
USE master
GO
sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
sp_configure 'CONTAINED DATABASE AUTHENTICATION', 1
GO
RECONFIGURE
GO
sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO
▲图1-使用脚本配置contained database authentication
第二种方法,使用SSMS向导(SQL Server Management Studio)。连接到想开启此功能的SQL Server实例上,在对象资源管理器中右击实例名称,单击“属性”菜单,单击如下所显示的“高级”页面,最后设置“Enable Contained Databases”的值为True,其默认值为False:
▲图2-使用向导配置contained database authentication
一旦在实例级中启用此功能,你可以在在CREATE DATABASE命令中使用CONTAINMENT = PARTIAL从句创建数据库,命令如下所示。如果没有指定,CONTAINMENT = NONE为默认值。
USE master
GO
--Contained Database Authentication
CREATEDATABASE [CDA]
CONTAINMENT = PARTIAL
ON PRIMARY
(
NAME = N'CDA',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\CDA.mdf' ,
SIZE = 4096KB ,
FILEGROWTH = 1024KB )
LOG ON
(
NAME = N'CDA_log',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\CDA_log.ldf' ,
SIZE = 1024KB ,
FILEGROWTH =10%)
GO
USE[CDA]
GO
IFNOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1AND name = N'PRIMARY')
ALTER DATABASE[CDA] MODIFY FILEGROUP [PRIMARY]DEFAULT
GO