Sébastien Pertus
Chapitre II : Synchronisation manuelle, personnalisation.
Après une introduction à Sync. Services for ADO.NET 2.0, nous allons construire aujourd'hui un ensemble de classes, sans passer par le designer, pour créer un système de synchronisation en nous appuyant sur Microsoft Synchronization Framework (MSF).
Par Sébastien Pertus publié le 13/01/2008 à 22:50, lu 8331 fois, 6 pages
 3 | Mise en place : Source de données
Nous allons travailler sur une base de données simple, et principalement sur 2 tables : la table Client et la table ClientType.
Le schéma de la base de données de démonstration :
 
/content/61a8af9e-e912-4557-b7c5-17e0734e14d7/SchemaBase.jpg
 
Note : les tables Employe et Facture sont là à titre d'informations mais ne seront pas utilisées dans nos exmples.
Nous observerons une règle particulière pour chacune des tables :
  1. La table Client devra être synchronisée de façon incrémentale.
  2. La table Client devra être personnalisée : Les enregistrements rapatriés sur le poste client devront être filtrés par EmployeId.
  3. La table ClientType doit être gérée comme un cache de données et devra être rappatriée intégralement à chaque synchronisation.
Pour satisfaire le suivi des modifications et de créations des lignes, nous rajoutons deux colonnes sur la table Client :
  1. CreationDate : Date de création de la ligne
  2. LastEditDate : Date de modification de la ligne
Le champ CreationDate porte une contrainte de création de ligne :

ALTER TABLE [dbo].[Client] ADD CONSTRAINT [DF_Client_CreationDate] DEFAULT (getutcdate()) FOR [CreationDate]

De même pour le champ LastEditDate :

ALTER TABLE [dbo].[Client] ADD CONSTRAINT [DF_Client_LastEditDate] DEFAULT (getutcdate()) FOR [LastEditDate]

Parallèlement à cela, nous devons être en mesure de récupérer les lignes effacées. Pour cela, nous créons un table "tombeau" où "reposent" les identifiants des lignes effacées :

CREATE TABLE [dbo].[Client_Tombstone]

(

[ClientId] [uniqueidentifier] NOT NULL,

[DeletionDate] [datetime] NULL

) ON [PRIMARY]

Il existe également des triggers sur cette table :

Trigger de suppression : A chaque ligne supprimée, une ligne est créée dans la table Tombstone :

CREATE TRIGGER [Client_DeletionTrigger]

    ON [Client]

    AFTER DELETE

AS

SET NOCOUNT ON

UPDATE [Client_Tombstone]

    SET [DeletionDate] = GETUTCDATE()

    FROM deleted

    WHERE deleted.[ClientId] = [Client_Tombstone].[ClientId]

IF @@ROWCOUNT = 0

BEGIN

    INSERT INTO [Client_Tombstone]

    ([ClientId], DeletionDate)

    SELECT [ClientId], GETUTCDATE()

    FROM deleted

END

Trigger de mise à jour : A chaque mise à jour de ligne, la colonne LastEditDate est mise à jour :

CREATE TRIGGER [Client_UpdateTrigger]

    ON [Client]

    AFTER UPDATE

AS

BEGIN

    SET NOCOUNT ON

    UPDATE [Client]

    SET [LastEditDate] = GETUTCDATE()

    FROM inserted

    WHERE inserted.[ClientId] = [Client].[ClientId]

END;

Trigger d'insertion : A chaque insertion, la colonne CreatedDate est mise à jour :

CREATE TRIGGER [Client_InsertTrigger]

    ON [Client]

    AFTER INSERT

AS

BEGIN

    SET NOCOUNT ON

    UPDATE [Client]

    SET [CreationDate] = GETUTCDATE()

    FROM inserted

    WHERE inserted.[ClientId] = [Client].[ClientId]

END;

J'ai inclus dans la solution la base de données sous la forme d'un projet Visual Studio Team DataBase for Professionnals. Si vous ne possédez pas cet outil Indispensable, vous trouverez également un fichier backup de la base de données Demo.
 
» Démarrer une discussion
 
Discussion démarée par mbergeron le 29/12/2008 à 15:27, 1 commentaire(s).
Discussion démarée par fcastell le 04/02/2008 à 09:53, 3 commentaire(s).