初探SQL Server 2012 包含数据库

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:
SQL Server将认证和授权分散给了不同的对象来完成。SQL Server的“登录名”用于认证,连接SQL Server的Windows账号或账号所在的组必须在SQL Server中有对应的登录名才能成功登录到SQL Server上。而每个数据库中的“用户”被授予了操作数据库中对象的相应权限。登录名和用户之间通过SID联系起来。每个登录名在master数据库中都记录有该登录名所对应的SID。而在用户数据库中,用户名也会和某个SID对应起来。通过SID的连接,登录名被映射到了数据库用户上,于是登录SQL Server的Windows账号也获得了操作数据库的相应权限。
 

今天看来这个机制带来了如下两个问题:

 

1. 提高了高可用解决方案的维护成本。举例来说,对于一个启用了数据库镜像的系统,如果你在主体服务器上添加了新的登录名来访问镜像数据库的话,你必须在镜像服务器上也添加相同的登录名,否则一旦发生了故障转移,数据库就无法使用新的登录名进行访问。另外,在镜像服务器上添加登录名时要确保和主体服务器上的登录名使用相同的SID。否则就会破坏登录名到数据库用户之间的对应关系,成为所谓的孤立用户。

迁移Login可以参考:How to transfer logins and passwords between instances of SQL Serverhttp://support.microsoft.com/kb/246133

 

2. 增加了迁移应用的复杂程度。应用程序所需要的数据都保存在用户数据库中,但是当你需要将应用从开发坏境迁移到生产环境,或者从老的服务器迁移到新的服务器上的时候,你不能仅仅简单的迁移用户数据库和程序。因为还有一部分和应用相关的数据遗漏在用户数据库之外,其中包括登录名。在迁移应用的时候,登录名需要被单独的从老的环境中提取出来,再部署到新环境上。

 

为了解决这样的问题,SQL Server 2012引入了新的特性,叫做Contained Database认证。Contained Database认证主要是由两类对象构成整个认证体系,一个叫做Contained Database。另一个是创建在Contained Database中的用户对象,被称为Contained database user。Contained database,顾名思义,就是将应用所需要的所有信息全部“包含”在用户数据库内部,不遗漏在系统数据库中。当应用程序连接contained database的时候,它不需要通过记录在master数据库中的登录名然后再映射到数据库用户,而是直接在contained database上进行验证,然后获得对应的contained database user被授予的权限进行数据库操作。可以说Contained database user就是一个把传统的登录名和数据库用户名的功能揉在一起的一种新的对象类型。有个Contained Database认证,上面谈到的两个问题就能很简单的得到解决。

 

Contained Database认证并不是独立于传统的Windows认证和SQL认证之外的新的认证方式,而是建立在这两种认证方式之上的新功能。也就是说,登录到SQL Server的账号依旧需要通过Windows认证或SQL Server认证的机制来验明正身,只是一旦验证通过该账号就会直接被转换成一个数据库用户。因此你根本不需要在实例中为该账户建立任何对应的登录名。

 

 

--SQL Server enable containeddatabase认证

EXECsp_configure'show advanced options', 1;

GO

RECONFIGUREWITHOVERRIDE;

GO

EXECsp_configure'contained databaseauthentication', 1;

EXECsp_configure'show advanced options', 0;

GO

RECONFIGUREWITHOVERRIDE;

go

 

--创建包含数据库 [ContainedDatabase]

 

USE[master]

GO

CREATEDATABASE[ContainedDatabase]CONTAINMENT=PARTIAL COLLATELatin1_General_100_CS_AS

GO

 

---创建包含数据库用户

USE[ContainedDatabase]

GO

CREATEUSER[test]WITHPASSWORD=N‘test’

GO

 

用创建的数据库用户登陆时需要注意要选择连接到Contained数据库(DBConnection也要指定,否则无法登陆数据库)。

 

 

连接后只能看到包含数据库:

 

 

包含用户属性:

 

验证过程(图片来自于http://blogs.msdn.com/b/sqlsecurity/archive/2010/12/08/contained-database-authentication-in-depth.aspx):

Contained Database除了能够使得认证过程“跳过”登录名这个对象之外,还带来了一些其他的好处。比如说,使用了Contained Database,你就不用担心数据库的collation和系统数据库的collation不一致的问题了。当你对于Contained database进行的SQL操作时,如果产生了临时表的话,临时表的collation全部是和Contained databasecollation一致,而不是和tempdb一致。

 

创建一个数据库排序规则为Latin1_General_100_CS_AS(系统数据库排序规则为Chinese_PRC_CI_AS

 

运行下面的语句我们会遇到排序规则冲突问题:

 

createdatabasetesta COLLATELatin1_General_100_CS_AS

 

GO

 

USEtesta;

GO

CREATETABLEdbo.test

(

bar NVARCHAR(32)

);

CREATETABLE#test

(

bar NVARCHAR(32)

);

GO

SELECT*

FROM #testASa

INNER JOINdbo.testASb

ON a.bar=b.bar;

GO

 

Msg 468, Level 16, State 9, Line 4

Cannot resolve the collation conflict between"Latin1_General_100_CS_AS" and "Chinese_PRC_CI_AS" in theequal to operation.

 

在Contained数据库上运行成功:

 

 

但是Contained数据也是有一些限制的,所以使用前要做评估:

部分包含数据库不允许以下功能。

· 部分包含数据库不能使用复制、更改数据捕获或更改跟踪。

· 编号过程

· 绑定到架构的对象,且依赖于可更改排序规则的内置功能

· 绑定因排序规则更改而导致的变化,包括对对象、列、符号或类型的引用。

· 复制、变更数据捕获和更改跟踪。

使用sys.dm_db_uncontained_entitiessys.sql_modules(Transact-SQL)视图可返回有关非包含对象或功能的信息

备注:

用户实体分为以下几种包含类别:

· 完全包含的用户实体(从不跨越数据库边界的用户实体),例如 sys.indexes任何使用这些功能的代码或任何只引用这些实体的对象也都是完全包含实体。

· 非包含用户实体(跨越数据库边界的用户实体),例如 sys.server_principals或服务器主体(登录名)本身。任何使用这些实体的代码或任何引用这些实体的功能都是非包含实体。


本文转自 lzf328 51CTO博客,原文链接:

http://blog.51cto.com/lzf328/969704



相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
8天前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
19 11
|
3天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
13 2
|
15天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
30 0
|
18天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
33 0
|
18天前
|
SQL 数据处理 数据库
|
18天前
|
SQL 存储 调度
|
18天前
|
SQL 安全 数据库
|
18天前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
37 0
|
4天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
57 11
|
23天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~