IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réplications SQL Server Discussion :

Problème Réplication avec proc stock personnalisée


Sujet :

Réplications SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème Réplication avec proc stock personnalisée
    Bonjour,

    J’essaie de paramétrer une réplication transactionnelle sur une table (pour l’exemple) entre deux bases de données qui ont exactement la même structure (tables, procédures stockées, vues etc.).
    Les données doivent être répliquées uniquement de l’éditeur vers l’abonnée.
    Cependant l’abonné peut avoir plus des tuples en plus dans sa table.
    Par ailleurs, j’ai comme contrainte que je ne peux pas modifier la structure de ma table (ajout de champ, modification de contrainte etc.).

    Voici la structure de ma table exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE ADM.TABLE_TEST(
    	ID_TABLE_TEST numeric(10, 0) NOT NULL,
    	NOM_TABLE_TEST nvarchar(50) NULL,
    CODE_TABLE_TEST nvarchar(50) NULL,
    	REPLIQUE numeric(1, 0) NULL,
     CONSTRAINT PK_ADM.TABLE_TEST PRIMARY KEY CLUSTERED 
    (
    	ID_TABLE_TEST ASC
    ) ON PRIMARY
    ) ON PRIMARY
    Remarque :
    - ID_TABLE_TEST n’est pas un identifiant auto incrémenté.
    - CODE_TABLE_TEST n’est pas une clef primaire, mais est unique dans la table (règle de gestion).
    - REPLIQUE est l’équivalent d’un booléen qui me permet de sélectionner les données à répliquer si sa valeur vaut 1 (dans tous les autres cas on ne réplique pas la ligne).

    Chez l’éditeur j’ai ces données dans la table :
    1, ‘Lundi’, ‘LUN’, 0
    2, ‘Mardi’, ‘MAR’, 1

    Chez l’abonnée j’ai ces données dans la table :
    1, ‘Vendredi’, ‘VEN’, 0
    2, ‘Samedi’, ‘SAM’, 0

    Mon but à l’issue de la réplication est d’obtenir chez l’abonné ces données :
    1, ‘Vendredi’, ‘VEN’, 0
    2, ‘Samedi’, ‘SAM’, 0
    3, ‘Mardi’, ‘MAR’, 1

    Le problème est que si je laisse la configuration par défaut de la réplication, l’éditeur va essayer d’insérer dans la table de l’abonnée la ligne :
    2, ‘Mardi’, ‘MAR’, 1
    Ce qui déclenche une exception de violation de clef primaire étant donné que dans la table de l’abonné, il existe déjà une ligne avec l’ID_TABLE_TEST à 2.

    Je décide donc de créer une procédure stockée personnalisée pour l’insertion de donnée que je veux substituer à la procédure par défaut.
    Voici son contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    CREATE PROCEDURE ADM.INSERT_TABLE_TEST 
    @c1 numeric(10,0),
    @c2 nvarchar(50),
    @c2 nvarchar(50),
    @c4 numeric(1,0)
    AS
    BEGIN
    	/*Test d'unicité sur le code_table_test : on insère la donnée 
    	que s'il n'existe pas d'élément avec ce code dans la table.*/
    	if not exists(select * from ADM.TABLE_TEST where CODE_TABLE_TEST =@c3)
    	BEGIN
    		/*On calcul le prochain identifiant*/
    		declare myCursor 
    		CURSOR FOR select isnull(max(ID_TABLE_TEST),0)+1 from ADM.TABLE_TEST
    		open myCursor; 
    		FETCH NEXT FROM myCursor INTO @c1; 
    		close myCursor; 
    		DEALLOCATE myCursor;
     
    		/*On insère le nouveau tuple dans la table*/
    		insert into ADM.TABLE_TEST( 
    		ID_TABLE_TEST, NOM_TABLE_TEST, CODE_TABLE_TEST, REPLIQUE
    		)
    		values ( 
    		@c1, @c2, @c3, @c4
    		)
    	END
    END
    La procédure est présente sur l’éditeur et sur l’abonnée.

    Je configure ensuite ma publication (sous SQL Server Entreprise Manager v8.0) par le wizard.
    Je sélectionne l’article ADM.TABLE_TEST.

    Je filtre les lignes de la table à l’aide de cette clause de filtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT <colonnes_publiées> FROM <<TABLE>> WHERE <<TABLE>>.REPLIQUE=1
    Puis dans les propriétés de l’article je coche la case ‘Remplacer les commandes INSERT par cet appel de procédure stockée :’.
    Et dans la zone de texte juste à coté je saisi : ‘CALL ADM.INSERT_TABLE_TEST’ soit le nom de ma procédure stockée personnalisée.
    Je décoche la case ‘Créer les procédures stockées au cours de la synchronisation initiale des abonnements’ étant donnée que mes bases de données éditeur et abonné possèdent déjà la procédure stockée.
    Enfin à lorsque l’on me demande ‘Si la table de donnée « TABLE_TEST » existe chez l’abonnée’ je sélectionne ‘Conserver la table existante inchangée’ au lieu de ‘Supprimer (à l’aide de DROP) la table existante et la recréer' sélectionné par défaut.

    A partir d’ici deux cas se présentent :
    1er cas :
    Je défini un nouvel abonnement où je précise à la question ‘Lors de la création de l’abonnement, Microsoft SQL Server doit-t-il initialiser le schéma et les données de l’abonnée ?’ dans l’onglet ‘Initialiser l’abonnement’ :
    ‘Non, l’abonné dispose déjà du schéma et des données’.

    Je lance ensuite l’agent et la capture, puis la réplication.
    Et j’obtiens le message d’erreur suivant :
    ‘Le processus n'a pas pu effectuer de copie en bloc dans la table : « "ADM"."TABLE_TEST" ».
    Violation de la contrainte PRIMARY KEY 'PK_ADM.TABLE_TEST'. Impossible d'insérer une clé en double dans l'objet 'TABLE_TEST'.
    (Source : <MON_SEVEUR> (Source de données) ; Numéro d'erreur : 2627)’


    2ème cas :
    Je supprime l’abonnement précédent et je défini un nouvel abonnement où je précise à la question ‘Lors de la création de l’abonnement, Microsoft SQL Server doit-t-il initialiser le schéma et les données de l’abonnée ?’ dans l’onglet ‘Initialiser l’abonnement’ :
    ‘Oui, initialiser le schéma et les données’.
    Je lance ensuite l’agent et la capture, qui me dit ‘Aucune capture instantanée n’a été générée car aucun abonnement ne nécessitait’.
    Je lance alors la réplication.
    Et j’obtiens le message suivant : ‘Opération réussie’, ‘Aucune transaction répliquée n’est disponible’.
    Et rien ne se passe au niveau de la base de donnée.

    Merci pour votre aide par avance.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Cependant l’abonné peut avoir plus des tuples en plus dans sa table.
    Non, cela n'est pas possible avec une réplication transactionnelle. Par essence la réplication transactionnelle impose la cohérence transactionnelle. Donc, interférer avec des nouvelles lignes ne pourra que vous causer des ennuis.
    Intéressez vous à un autre mode de réplication.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Non, cela n'est pas possible avec une réplication transactionnelle. Par essence la réplication transactionnelle impose la cohérence transactionnelle. Donc, interférer avec des nouvelles lignes ne pourra que vous causer des ennuis.
    Intéressez vous à un autre mode de réplication.

    A +
    Ok, au moins ça a la mérite d'être clair
    Quelle est donc la meilleur solution dans mon cas ? La publication de fusion ? Faire un script maison ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Si vous ne répliquez qu'une seule table, une solution manuelle est envisageable, par exemple par l'intermédiaire d'un service web (over http). Sinon, la réplication de fusion est la seule possible dans le cas ou l'abonné modifie aussi les même données.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Si vous ne répliquez qu'une seule table, une solution manuelle est envisageable, par exemple par l'intermédiaire d'un service web (over http). Sinon, la réplication de fusion est la seule possible dans le cas ou l'abonné modifie aussi les même données.

    A +
    Non en fait il n'y a pas qu'une seule table, c'était juste pour avoir un exemple simple.

    Dans mon cas, l'abonnée ne peut pas modifier/supprimer les données répliquées (celles venant de l'éditeur).
    Au mieux il peut ajouter/modifier/supprimer des nouvelles données mais qui ne doivent pas être recopiées sur l'éditeur.

  6. #6
    Candidat au Club
    Inscrit en
    Mars 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Et sinon juste pour ma culture générale, comme faire en sorte qu'une réplication transactionnelle utilise une procédure personnalisée que l'on a défini soi même (pour remplacer celle par défaut utilisée pour INSERT/UPDATE/DELETE) ?

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dans mon cas, l'abonnée ne peut pas modifier/supprimer les données répliquées (celles venant de l'éditeur).
    dans ce cas utilisez la réplication peer to peer (2005).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Datetime SQL Server avec Proc Stock Parameterized
    Par quake3 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 18/03/2013, 15h34
  2. Problème erreur avec procédure stockée
    Par hugo7 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 03/02/2009, 18h22
  3. formview avec proc stocks
    Par hiul dragonfel dans le forum ASP.NET
    Réponses: 1
    Dernier message: 27/12/2007, 12h13
  4. Problème Réplication avec proc stock personnalisée
    Par .:Dante:. dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/11/2007, 19h06
  5. [Débutant] Problème avec les paramètres d'une proc stockée
    Par babulior dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/06/2005, 16h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo