在不一样业务需求的驱动下,数据库的模块化拆分将会面临一些比较特殊的业务逻辑处理需求。例如,在数据库层面的数据同步需求。同步过程当中,可能会有一些比较复杂的业务逻辑判断。简单介绍几个SQL Server提供的数据同步功能。 数据库
经过连接数据库能够实现不一样实例间数据的访问和更新操做。一般会与OPENQUERY行集函数一块儿使用,以免分布式事务的干涉。不建议直接使用已连接服务来作远程数据的更新操做,由于这须要使用到分布式数据库的事务管理。SQL Server的分布式事务须要经过Windows的DTC(Distributed Transaction Controller,分布式事务控制器)来管理和协调不一样服务器,或者说不一样数据库实例间的资源和事务调整,其性能与普通的事务管理成几何倍的增加。 安全
如图10-4,页面是已连接服务的配置界面,能够经过SSMS的Server Objects中的Linked Servers可视化页面来进行配置。 服务器
图11-4 数据库的已连接服务 分布式
Provider是已连接服务器链接数据库时使用的适配器的类型,如图11-4中,左边部分显示的,列出了几趾已有的适配器的类型。示例中,使用SQLOLEDB类型的适配器进行数据库链接。 ide
Security页用来配置连接服务器的验证信息,它包括如图11-5中所示的4种模式的验证方式。 模块化
Not be made 函数
当选择此认证模式时,已连接服务将使用本地服务的登录用户与远程服务登录用户的映射配置列表中的帐号。如图中,当选择此模式时,本地将只能使用sa登录时,模拟远程服务的sa帐号的权限配置。 性能
Without using a Security context 测试
选择此模式将不使用验证模式,它只利用SQL Server服务的登录帐号进行验证,此服务要求在Windows服务启动时,本地服务和远程服务使用相同的登录帐号。 this
Using current security context
当使用此模式时,要求本地和远程服务都要有相同的帐号及密码,一般这些配置为Windows集成认证的时候使用。
Using this security context
使用此模式时,将使用下面配置的用户和密码进行登录远程服务。
本小节中只是简略地介绍了关于这些配置的简要步骤,要获取更详细的内容,请参考SQL Server联机丛书(http://technet.microsoft.com/zh-cn/library/ff772782.aspx)。
图11-5 连接服务器安全配置
更改跟踪是SQL Server 2008加入的一个轻量级的数据修改记录功能,它是数据变动捕获功能的缩减版本。它能够将已修改数据的主键记录在对应的视图中,然后经过系统函数访问该视图,得到相应的变动数据。经过变动数据的记录,能够实现增量地处理复杂的业务逻辑,然后将数据结果保存到目标数据库中。
示例代码如代码清单11-1中所示,开启更改跟踪是依据表来配置的,可是在配置表的更改跟踪以前,须要将数据库的更改跟踪选项开启,开启数据库更改跟踪选项时,默认会将更改跟踪记录保留2天,并开启自动清理的选项。
更改跟踪能够跟踪到具体的字段更改配置,如代码清单11-1中,TRACK_COLUMNS_UPDATED配置所示,当选项为ON状态时,将会记录下更改跟踪修改的字段,当为OFF时,将不会记录。
USE master
GO
ALTER DATABASE [AdventureWorks2008R2] SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS,AUTO_CLEANUP = ON);
GO
USE AdventureWorks2008R2
GO
ALTER TABLE Person.BusinessEntity ENABLE CHANGE_TRACKING WITH(TRACK_COLUMNS_UPDATED = ON);
GO
UPDATE TOP(10) Person.BusinessEntity
SET ModifiedDate=ModifiedDate;
GO
SELECT *
FROM CHANGETABLE(CHANGES Person.BusinessEntity,0) AS o;
GO
代码清单11-1 设置更改跟踪
图11-6 更改跟踪查询结果
代码清单11-1中的执行结果如图11-6中所示,使用CHANGETABLE能够得到对应表的更改历史,更改历史会将原有表的主键记录下来,如图11-6中BusinessEntityID字段所示。
关于更改跟踪的详细信息,能够参考一下SQL Server联机丛书。
Service Broker是SQL Server自带的消息队列机制,经过Service Broker能够实现数据实例与实例间的通信,同时也能够做为数据库实例与应用程序的消息传递机制。
同时,Service Broker是队列机制实现的,能够保证消息的执行顺序,对于具备事务性要求的数据同步,Service Broker将是很理想的一个数据同步实现。
如代码清单11-2中所示,配置了Service Broker在同实例下的同步配置。配置包括建立消息类型(Message Type),建立消息规则(Contract),队列(Queue)以及服务(Server)。其层级结构如图11-7中所示,首先,消息是存放在队列中的,每一个队列都须要一个惟一的服务对应,服务将成为找到对应的标识。服务与服务间通信时,须要指定相同的,相互能够识别到的消息规则,这些规则会指定对应的消息通信的类型。其工做的流程,如图11-8中所示。
图11-7 Service Broker的组件组成
图11-8 Service Broker的工做原理
当须要进行队列传输前,须要开启一个会话(Conversation),经过会话记录下对应的服务标识,标识从源服务发送到目标服务。找到会话标识后即可以找到对应的队列。
开启会话之后,进行消息发送,对于数据库实例来讲,只须要将消息写入到发送队列就能够了。消息被写入到发送队列后,后续的工做都交给Service Broker来处理。
当消息进入发送队列,Service Broker根据会话记录的服务标识,找到目标服务,并将消息拆分为多个消息片段,将消息发送到目标服务,服务接收完成全部的消息后,将消息写入到目标队列中。在写入到目标队列后,消息传递就结束了。后续的工做便交给应用处理了。
应用须要调用接收消息的命令,将消息从接收队列中取出,并进行一系列的后续业务工做。
关于Service Broker能够参考SQL Server联机丛书(http://technet.microsoft.com/zh-cn/library/ms166104(v=SQL.105).aspx)。
下面的代码是一份在同一实例下进行Service Broker配置以及测试的脚本,能够参考一下代码,并结合上图11-8中的工做原理参考Service Broker的工做方式。
use master
go
alter database AdventureWorks2008R2 set enable_broker with rollback immediate;
go
use AdventureWorks2008R2
go
create message type ReceiveMsgType validation = none;
create message type SendMsgType validation = none;
go
create contract SampleContract(SendMsgType sent by initiator,ReceiveMsgType sent by target,FraudEndOfStream sent by initiator);
go
create queue SampleTargetQue;
create service SampleTargetSrv on queue SampleTargetQue(SampleContract);
go
create queue SampleInitQue;
create service SampleInitSrv on queue SampleInitQue(SampleContract);
go
/********************************Send Test********************************************
declare @handle uniqueidentifier,@msg varchar(8000) = 'this is a test message!';
begin dialog conversation @handle
from service SampleInitSrv
to service 'SampleTargetSrv'
on contract SampleContract
with encryption = off;
send on conversation @handle
message type SendMsgType(@msg)
**********************************************************************************/
/*****************************Receive Test*************************************************
declare @receivemsg varchar(8000),@Handle uniqueidentifier;
waitfor(receive top(1) @Handle = conversation_handle,
@receivemsg = Message_Body
from SampleTargetQue),timeout 1000
end conversation @handle;
select @receivemsg;
**********************************************************************************/
代码清单11-2 同实例下的Service Broker配置