所以我有一个中央数据库(2008 R2)。从这台服务器我想将某些数据同步到用户设备(到CE 3.5数据库),这是一种单向同步,数据在设备上是只读的。假设我有一个图像相册应用程序,我希望能够将相册同步到设备。
数据库包含许多相册和图片,因此我不想将所有相册同步到用户。相反,用户选择他想要同步到他/她的设备的专辑。
数据库描述:
到目前为止,使用带有基于参数的过滤器的同步框架(2.1)并在所需相册的 NUM_ID 上配置服务器数据库可以正常工作范围。
现在在我的应用程序中,很多专辑共享图像。我希望用户能够将多个专辑下载到他们的设备上。而现在我开始遇到同步框架的问题。因此,向数据库添加另一个范围没有问题。
但是当我第二次同步到本地数据库时,它首先删除第一次同步创建的所有跟踪表。所以第二种同步类型的工作方式,就像它下载查看第二张专辑所需的数据一样。但是,它不会比较数据库中已有的任何图像,而只是下载所选相册中的所有图像。让我们说大约80%的图像是共享的,那么大部分数据都是完全没必要的。
所以我的问题是,有没有办法配置同步框架不删除跟踪表(或使其工作的东西)?
或者我应该看看除了同步框架之外的其他内容? (@EricEJ之前曾暗示过某些名为 SQL Server Merge Replication 的内容可适用于我的应用程序。)
我更喜欢使用某种框架,所以我不必在数据库中创建所有存储过程和触发器等。
以下是同步日志的一部分,这是同步第二张专辑时(即一个范围已经同步到CE数据库)。
VERBOSE, Connecting using string: Data Source=***;Initial Catalog=dt;User ID=**;Password=****
VERBOSE, Reading Schema Version Info
VERBOSE, Executing Command: SELECT [schema_major_version], [schema_minor_version], [schema_extended_info] FROM [sync].[schema_info]
VERBOSE, Connecting using string: Data Source=***;Initial Catalog=dt;User ID=sync
INFO , ----- Populating Scope Provisioning from Scope Description for '1027_SyncScope' -----
INFO , Adding Table Provisioning for '[dt_album].[ALBUMS]'
INFO , Adding Table Provisioning for '[dt_album].[ALBIMGLINKS]'
INFO , Adding Table Provisioning for '[dt_album].[IMAGES]'
INFO , --- END Populating Scope Provisioning from Scope Description for '1027_SyncScope' ---
VERBOSE, Connecting to database: TEstMC.sdf
VERBOSE, Executing Command: SELECT [schema_major_version], [schema_minor_version], [schema_extended_info] FROM [schema_info]
VERBOSE, Connecting to database: TEstMC.sdf
VERBOSE, Connecting to database: TEstMC.sdf
VERBOSE, Executing Command: SELECT [schema_major_version], [schema_minor_version], [schema_extended_info] FROM [schema_info]
VERBOSE, Executing Command: SELECT [schema_major_version], [schema_minor_version], [schema_extended_info] FROM [schema_info]
INFO , ----- Provisioning Scope '1027_SyncScope' on Database 'TEstMC.sdf' -----
VERBOSE, Executing Command: SELECT [schema_major_version], [schema_minor_version], [schema_extended_info] FROM [schema_info]
INFO , Dropping Tracking Table '[ALBUMS]'<------------------- WHY???
INFO , Creating Tracking Table '[ALBUMS_tracking]'
VERBOSE, Executing Command: CREATE TABLE [ALBUMS_tracking] ([NUM_ID] int NOT NULL, [sync_row_is_tombstone] int NOT NULL, [sync_update_peer_key] int NOT NULL, [sync_update_peer_timestamp] bigint NOT NULL, [sync_create_peer_key] int NOT NULL, [sync_create_peer_timestamp] bigint NOT NULL, [sync_update_bsn] bigint DEFAULT 0 NOT NULL, [last_change_datetime] datetime DEFAULT GETDATE() NULL)
VERBOSE, Executing Command: ALTER TABLE [ALBUMS_tracking] ADD CONSTRAINT [PK_ALBUMS_tracking] PRIMARY KEY ([NUM_ID])
INFO , Adding Change Tracking index to Tracking Table '[ALBUMS_tracking]'
VERBOSE, Executing Command: CREATE INDEX sysChangeTxBsn_idx ON [ALBUMS_tracking] (sync_update_bsn);
VERBOSE, Executing Command: SELECT [schema_major_version], [schema_minor_version], [schema_extended_info] FROM [schema_info]
... (same for all other tables in scope (repeted from "Dropping Tracking Table..."))
INFO , Deleting Scope Info entry '1027_SyncScope'
VERBOSE, Executing Command: DELETE [scope_info] WHERE [sync_scope_name] = @scopeName
VERBOSE, Parameter: @scopeName Len: 14 Value: 1027_SyncScope
INFO , Adding Scope Info entry for '1027_SyncScope'
INFO , UserComment:
VERBOSE, Executing Command: INSERT INTO [scope_info] ([sync_scope_name], [scope_config_id], [scope_timestamp], [scope_user_comment]) VALUES (@scopeName, @configId , 1, @userDesc)
VERBOSE, Parameter: @scopeName Len: 14 Value: 1027_SyncScope
VERBOSE, Parameter: @configId Value: b8568957-a533-4a85-9cb6-d49be9012ef5
VERBOSE, Parameter: @userDesc Value:
INFO , Adding Scope Config Entry for config id 'b8568957-a533-4a85-9cb6-d49be9012ef5'
VERBOSE, Executing Command: INSERT INTO [scope_config] ([config_id], [config_data]) VALUES (@configId, @configData)
VERBOSE, Parameter: @configId Value: b8568957-a533-4a85-9cb6-d49be9012ef5
VERBOSE, Parameter: @configData Len: 8177 Value: <SqlCeSyncProviderScopeConfiguration xmlns:xsi="ht...
INFO , --- END Provisioning Scope '1027_SyncScope' on Database 'TEstMC.sdf' ---
然后同步开始