SQL Server 2012引入了包含数据库(Contained Database),解决了与当前(非包含)数据库关联的某些问题和复杂性。包含的数据库不依赖于其所属服务器相关的配置、管理、排序规则和安全认证信息,因此可以在数据库实例间方便的移动和部署,使数据库的应用和实例分离开来,也使研发能够更好的集中在应用和功能本身。下面将从什么是包含数据库,如何创建包含数据库,如何将数据库转换为部分包含的数据库,如何将用户迁移为包含的数据库用户,以及如何备份和还原包含数据库等几个方面来熟悉一下2012的这个新特性。

  • 当前(非包含)的数据库所面临的问题
    在描述什么是包含数据库之前,先了解一下为什么会出现包含数据库。当前的数据库有一些问题,如下:
    1、在数据库迁移或部署的过程中一些信息会丢失
         当我们将数据库从一个SQL Server实例迁移到另一个实例是,诸如登陆、工作代理等信息将不能一起被迁移。因为这些信息有特殊用途,自创建后就常驻SQL Server实例。在新的SQL Server实例上重新创建这些任务将是一个耗时、易出错的过程。
    2、从应用开发转向部署
         在Server上部署应用时或许会遇到一些障碍,因为很有可能环境不匹配。例如,创建login时可能没权限,命令行实用工具(如“xp_cmdshell”)或许是禁用的,应用里用到的数据库排序规则或许和Server初始指定的(也可能是默认的)排序规则不同。
    3、应用管理的安全考量
         管理和维护单个数据库比较困难,因为login、job agent等信息是跨数据库实例访问的,因此,允许用户对整个实例授权将引起对其他数据库的不必要访问,进而导致安全隐患。
  • 什么是包含的数据库
    义如其名,它是一种自我包含的数据库。例如,它自带所有创建数据库时所需要的数据库设置及元数据信息。它独立于SQL Server实例,没有外部依赖关系,自带授权用户的自我包含机制。由于它独立于数据库实例,就使得在部署到不同服务器时数据库的排序规则不再是一个问题。
    一个包含的数据库,保留了所有数据库里必要信息和对象,如表、函数、限制、架构、类型等。它也存有所有数据库里的应用级对象,如登陆、代理作业、系统设置、链接服务器信息等。
    这种数据库带给我们的好处是,可以轻松地从一台Server搬移到另一台,并且不需要做任何额外配置就可以立即使用它,因为他们没有任何外部的依赖。
  • 4步创建包含的数据库
    步骤1、启用包含的数据库
    方法1: 使用 Management Studio 启用包含的数据库
    1.在对象资源管理器中,右击服务器名称,然后单击“属性”

    2.在“高级”页面上的“包含”部分中,将“启用包含的数据库”选项设置为“True”(默认为“False”)。

    3.单击“确定”。
    方法2: 使用T-SQL启用包含的数据库

    --Enabled Advanced options
    sp_configure 'show advanced', 1;
    RECONFIGURE WITH OVERRIDE;
    go
    --Enabled Database Containment
    sp_configure 'contained database authentication', 1;
    RECONFIGURE WITH OVERRIDE;
    go

    步骤2、创建一个数据库,并将它的包含类型设置为“部分”
    1. 创建一个名为“TestContainedDB”的数据库,然后右击该数据库并单击其属性

    2. 在“选项”一栏,将包含类型选择为“部分”,最后单击“确认”。

    步骤2也可以通过T-SQL实现:

    USE [master]
    GO/****** Object:  Database [TestContainedDB]    Script Date: 2012/4/18 16:31:14 ******/
    CREATE DATABASE [TestContainedDB]CONTAINMENT = PARTIALON  PRIMARY
    ( NAME = N'TestContainedDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TestContainedDB.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON
    ( NAME = N'TestContainedDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TestContainedDB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
    GOALTER DATABASE [TestContainedDB] SET COMPATIBILITY_LEVEL = 110
    GOIF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
    begin
    EXEC [TestContainedDB].[dbo].[sp_fulltext_database] @action = 'enable'
    end
    GOALTER DATABASE [TestContainedDB] SET ANSI_NULL_DEFAULT OFF
    GOALTER DATABASE [TestContainedDB] SET ANSI_NULLS OFF
    GOALTER DATABASE [TestContainedDB] SET ANSI_PADDING OFF
    GOALTER DATABASE [TestContainedDB] SET ANSI_WARNINGS OFF
    GOALTER DATABASE [TestContainedDB] SET ARITHABORT OFF
    GOALTER DATABASE [TestContainedDB] SET AUTO_CLOSE OFF
    GOALTER DATABASE [TestContainedDB] SET AUTO_CREATE_STATISTICS ON
    GOALTER DATABASE [TestContainedDB] SET AUTO_SHRINK OFF
    GOALTER DATABASE [TestContainedDB] SET AUTO_UPDATE_STATISTICS ON
    GOALTER DATABASE [TestContainedDB] SET CURSOR_CLOSE_ON_COMMIT OFF
    GOALTER DATABASE [TestContainedDB] SET CURSOR_DEFAULT  GLOBAL
    GOALTER DATABASE [TestContainedDB] SET CONCAT_NULL_YIELDS_NULL OFF
    GOALTER DATABASE [TestContainedDB] SET NUMERIC_ROUNDABORT OFF
    GOALTER DATABASE [TestContainedDB] SET QUOTED_IDENTIFIER OFF
    GOALTER DATABASE [TestContainedDB] SET RECURSIVE_TRIGGERS OFF
    GOALTER DATABASE [TestContainedDB] SET  DISABLE_BROKER
    GOALTER DATABASE [TestContainedDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
    GOALTER DATABASE [TestContainedDB] SET DATE_CORRELATION_OPTIMIZATION OFF
    GOALTER DATABASE [TestContainedDB] SET TRUSTWORTHY OFF
    GOALTER DATABASE [TestContainedDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
    GOALTER DATABASE [TestContainedDB] SET PARAMETERIZATION SIMPLE
    GOALTER DATABASE [TestContainedDB] SET READ_COMMITTED_SNAPSHOT OFF
    GOALTER DATABASE [TestContainedDB] SET HONOR_BROKER_PRIORITY OFF
    GOALTER DATABASE [TestContainedDB] SET RECOVERY FULL
    GOALTER DATABASE [TestContainedDB] SET  MULTI_USER
    GOALTER DATABASE [TestContainedDB] SET PAGE_VERIFY CHECKSUM
    GOALTER DATABASE [TestContainedDB] SET DB_CHAINING OFF
    GOALTER DATABASE [TestContainedDB] SET DEFAULT_FULLTEXT_LANGUAGE = 2052
    GOALTER DATABASE [TestContainedDB] SET DEFAULT_LANGUAGE = 2052
    GOALTER DATABASE [TestContainedDB] SET NESTED_TRIGGERS = ON
    GOALTER DATABASE [TestContainedDB] SET TRANSFORM_NOISE_WORDS = OFF
    GOALTER DATABASE [TestContainedDB] SET TWO_DIGIT_YEAR_CUTOFF = 2049
    GOALTER DATABASE [TestContainedDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
    GOALTER DATABASE [TestContainedDB] SET TARGET_RECOVERY_TIME = 0 SECONDS
    GOALTER DATABASE [TestContainedDB] SET  READ_WRITE
    GO--------附:使用T_SQL将数据库转换为部分包含的数据库
    USE [master]
    GO
    ALTER DATABASE [TestContainedDB] SET CONTAINMENT = PARTIAL
    GO
  • 步骤3、创建一个包含的用户
    1. 新建用户

    2.创建用户名和密码,这里的用户名为TestUser,密码是Test@PWD1
    注意:密码需要达到复杂度要求,如英文字母、数字、特殊符号等,否则在创建时可能会遇到报错

    3. 成员身份选择“db_owner”

    通过T-SQL创建:

    USE [TestContainedDB]
    GO
    CREATE USER [TestUser]
    WITH PASSWORD='Test@PWD1',
    DEFAULT_SCHEMA=[dbo]
    GO

    创建好后,就可以在数据库的用户里看到:

    步骤4、 用包含的用户登录包含的数据库
    1.  在登录栏输入登录名(这里用的是TestUser)和密码(这里用的是Test@PWD1)

    2. 在连接属性栏(点击登陆界面的“选项”,展开后就可以看到)输入要连接的数据库名称(这里是TestContainedDB)

    3. 点击“连接”,即可登陆成功

  • 将非包含的数据库转换为包含的数据库
    这里,我先创建一个非包含的数据库(命名为:TestNonContainedDB),并建一张表和一个存储过程(如下截图),即为非包含数据库创建连个常见的对象。
    USE [master]
    GO/****** Object:  Database [TestNonContainedDB]    Script Date: 2012/4/19 10:27:16 ******/
    CREATE DATABASE [TestNonContainedDB]CONTAINMENT = NONEON  PRIMARY
    ( NAME = N'TestNonContainedDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TestNonContainedDB.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON
    ( NAME = N'TestNonContainedDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TestNonContainedDB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
    GO
    


    下面开始一步步将非包含的数据库转换成包含的数据库:
    1. 创建一个登录名和一个用户

    --Create a login on the server
    use master
    CREATE LOGIN NonContainedUser
    WITH PASSWORD = 'PWD+12345'--Create a "non-contained" users for the login on the server
    USE TestNonContainedDB
    GO
    CREATE USER NonContainedUser FOR LOGIN NonContainedUser
    GO

    2. 先看看当前DB有哪些非包含的对象。由下图可见,忽略ROUTE,当前有1个非包含的数据库对象

    SELECT class_desc,feature_name,feature_type_name
    FROM sys.dm_db_uncontained_entities
    


    对于非包含的用户,我们从下面可以看到只有1个:

    USE TestNonContainedDB
    GO
    SELECT dp.name
    FROM sys.database_principals dp
    JOIN sys.server_principals sp ON dp.sid = sp.sid
    WHERE dp.authentication_type = 1AND sp.is_disabled = 0 

    3. 将数据库转换为部分包含的数据库
    在对象资源管理器中,展开“数据库”,右键单击要转换的数据库(这里是TestNonContainedDB),然后单击“属性”,在“选项”页面上,将“包含类型”选项更改为“部分”,最后单击“确定”。或者使用如下T-SQL:

    USE [master]
    GO
    ALTER DATABASE TestNonContainedDB SET CONTAINMENT = PARTIAL
    GO

    4. 将用户迁移为包含的数据库用户
    迁移之前先看看当前的用户属性:

    现在执行下面的命令进行迁移:

    USE TestNonContainedDB
    GO
    EXEC sp_migrate_user_to_contained @username = N'NonContainedUser', @rename = N'keep_name', @disable_login = N'disable_login'

    执行之后再看看用户的属性,这是用户类型变成了带密码的SQL用户:

    再验证一下非包含的用户,由下图可见,将用户迁移为包含的数据库用户之后,对应的非包含用户就消失了;同时,对应的登录名也是被禁用状态。

    如果要将所有基于 SQL Server 登录名(启用的)的用户迁移到具有密码的包含的数据库用户,可在包含的数据库中执行下面命令:

    DECLARE @username sysname ;
    DECLARE user_cursor CURSORFOR SELECT dp.name FROM sys.database_principals AS dpJOIN sys.server_principals AS sp ON dp.sid = sp.sidWHERE dp.authentication_type = 1 AND sp.is_disabled = 0;
    OPEN user_cursor
    FETCH NEXT FROM user_cursor INTO @usernameWHILE @@FETCH_STATUS = 0BEGINEXECUTE sp_migrate_user_to_contained @username = @username,@rename = N'keep_name',@disablelogin = N'disable_login';FETCH NEXT FROM user_cursor INTO @usernameEND
    CLOSE user_cursor ;
    DEALLOCATE user_cursor ;
    

    5. 用迁移的用户登录

  • 备份包含的数据库
    备份包含的数据库可以以备份非包含的数据库的方式(通过SSMS或T-SQL)来实现。唯一要注意的是,如果是通过包含的用户登录,则通过SSMS备份在右击数据库名称时会遇到如下问题(通过带登录名的SQL用户登录,就不会有此问题,当然也要有备份包含的数据库的权限):

    不过没关系,你可以通过T_SQL实现:
  • 还原包含的数据库

以上比较详细的介绍了包含的数据库的概念、创建、迁移、备份及还原等,其他相关信息,可以再参考MSDN:http://msdn.microsoft.com/zh-cn/library/ff929071.aspx

SQL Server 2012中包含的数据库(Contained Database)探索相关推荐

  1. 微软BI 之SSAS 系列 - 在SQL Server 2012 中开发 Analysis Services Multidimensional Project

    SQL Server 2012 中提供了开发 SSAS 项目的两种模型,一种是新增加的 Tabular Model 表格模型,另一种就是原始的 Multidimensional Model 多维模型. ...

  2. SQL Server 2012中的Contained Database尝试

    简介 SQL Server 2012新增的Contained Database是为了解决数据库在不同SQL Server实例之间迁移的问题.在以往的情况下,数据库本身并不包含一些实例级别的配置参数(比 ...

  3. 解读SQL Server 2012中的最新BI功能

    如果SQL Server 2008 R2的重点是让商务智能(BI)的使用者像使用自助服务一样便捷,那么SQL Server 2012则是让自助服务BI这一概念延伸至让IT人员更容易进行管理. 事实上, ...

  4. SQL server 2012 中USE和GO的用法

    一.USE 命令 USE 的用法:USE 数据库名 USE //跳转到需要操作的数据库. 例子:USE [ssqadm] 跳转到ssqadm数据库下,对ssqadm数据库下的对象和数据进行操作. US ...

  5. SQL Server 2012中的ColumnStore Index尝试

    费了半天劲,今天终于装好SQL Server2012了.按照MSDN中的新特性资料(Columnstore Indexes for Fast DW QP SQL Server 11).尝试了下Colu ...

  6. SQL Server 2012 中的 Service Broker功能的一些改进或增强

    1. 可以将消息发送到多个目标服务(多播) 通过支持多个会话句柄,扩展了 SEND (Transact-SQL) 语句的语法以启用多播. DECLARE @dialog_handle1 UNIQUEI ...

  7. sql server 2012中red gate的sql source control消失

    找到C:\ProgramData\Microsoft\SQL Server Management Studio\11.0\Addins路径,用notepad++打开RedGate.SIPFramewo ...

  8. 《数据库原理与应用》(第三版) 第4章SQL Server 2012基础 习题参考答案

    1.安装SQL Server 2012对硬盘及内存的要求分别是什么? 答:SQL Server 2012实际硬盘空间需求取决于系统配置和您决定安装的功能,一般应确保系统驱动器中是否有至少 6.0 GB ...

  9. sql 数据库检查_数据库检查点– SQL Server 2016中的增强功能

    sql 数据库检查 When a new row is inserted or an existing one is updated in your database, the SQL Server ...

最新文章

  1. HDD工作原理 导图
  2. 区块链项目-Lisk
  3. Keras搭建YoloV4目标检测平台
  4. mysql Range按时间分区问题 Table has no partition for value 737669
  5. 热门的模型跨界,Transformer、GPT做CV任务一文大盘点
  6. wampserver环境下,apache本地下设置多个域名
  7. SharePoint无代码工作流设计开发实例——交通费报销流程(二)
  8. English——视频总结(一)
  9. 【Shiro第七篇】SpringBoot + Shiro实现会话管理
  10. ShellExecute、ShellExecuteEx和SHELLEXECUTEINFO 的使用
  11. android 汉字拼音排序,Android实现中文按拼音排序方法
  12. Java推箱子游戏,文档+源码
  13. lvm 多个硬盘合成一个_linux使用LVM合并硬盘
  14. 怎样写好求职简历(STAR法则)
  15. XML shema 约束入门 (2 ) 约束文件加入与说明
  16. 求最大公约数和最小公倍数的方法:
  17. RuntimeError: Unsupported: ONNX export of Slice with dynamic inputs. DynamicSlice is a deprecated ex
  18. ceph中monitor节点基本解释与图解
  19. linux网卡驱动离线安装_linux下网卡驱动安装全过程
  20. pytorch 报告bug: Assertion idx_dim >= 0 idx_dim < index_size “index out of bounds“

热门文章

  1. 高精度定位系统:地铁隧道人员定位智能巡检
  2. 关于Linux中jdk的安装,WebLogic的安装及部署
  3. spring cloud集成nacos注册中心、配置中心、服务远程调用
  4. JavaScript基础经典面试试题(附答案)
  5. 导数、偏导数、方向导数和梯度的基本介绍
  6. 1678 GG's Single Day
  7. 图片格式转换怎么做?不如试试这三个方法
  8. 考研数据结构名词解释
  9. make/Makefile的用法
  10. [转]IOS5添加全局英汉字典教程,ibooks,safari内可用