OVH Cloud OVH Cloud

comparaison et mise à jour de tables

4 réponses
Avatar
le_scrameustache
Bonjour,

j'ai besoin d'un avis sur la methodologie à mettre en place afin de faire
une misa à jour d'une table en fonction d'une autre. Je tiens à préciser que
je ne peux utiliser de triggers, mais je souhaiterais cependant avoir une
méthode rigoureuse.

Je possède deux tables, l'une est "table_source", l'autre est "table_cible".
Chacune à la même structure.

J'aimerais pouvoir mettre à jour la table_cible à partir de table_source.
Ainsi, si la ligne de table_source est dans table_cible, je ne fais rien, si
la ligne n'existe que dans table_source mais pas dans table_cible, j'insère,
et enfin, s'il existe une modification quelconque de la ligne (hormis l'ID
qui est clé primaire) je mets à jour la ligne dans la table_cible.

Voici mon code qui ne marche pas en cas de modifiaction d'une ligne de la
table_source car ce code insère dans ce cas un doublon dans la table_cible.

Citation:
insert into table_cible select * from table_source where not exists
(select * from table_cible where and table_source.id = table_ref.id
table_source.champ1 = table_ref.champ1 and table_ref.champ2 =
table_source.champ2)


Alors, je ne sais pas la méthodologie la plus efficace et optimisée à
employer pour faire ce test. Faire un long test en comparant l'ID, puis le
contenu de chaque champ, ne me semble pas très beau!

Si quelqu'un pouvait m'aider, ça serait très sympa.

4 réponses

Avatar
Fred BROUARD
Une procédure stockée en trois parties :

1) je met à jour les lignes existantes avec des différences.
2) j'ajoute les lignes inexistante
3) je supprime les lignes en trop.

Tout cela dans une transaction au niveau d'isolation REPEATABLE READ

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


le_scrameustache a écrit:
Bonjour,

j'ai besoin d'un avis sur la methodologie à mettre en place afin de faire
une misa à jour d'une table en fonction d'une autre. Je tiens à préciser que
je ne peux utiliser de triggers, mais je souhaiterais cependant avoir une
méthode rigoureuse.

Je possède deux tables, l'une est "table_source", l'autre est "table_cible".
Chacune à la même structure.

J'aimerais pouvoir mettre à jour la table_cible à partir de table_source.
Ainsi, si la ligne de table_source est dans table_cible, je ne fais rien, si
la ligne n'existe que dans table_source mais pas dans table_cible, j'insère,
et enfin, s'il existe une modification quelconque de la ligne (hormis l'ID
qui est clé primaire) je mets à jour la ligne dans la table_cible.

Voici mon code qui ne marche pas en cas de modifiaction d'une ligne de la
table_source car ce code insère dans ce cas un doublon dans la table_cible.

Citation:
insert into table_cible select * from table_source where not exists
(select * from table_cible where and table_source.id = table_ref.id
table_source.champ1 = table_ref.champ1 and table_ref.champ2 =
table_source.champ2)


Alors, je ne sais pas la méthodologie la plus efficace et optimisée à
employer pour faire ce test. Faire un long test en comparant l'ID, puis le
contenu de chaque champ, ne me semble pas très beau!

Si quelqu'un pouvait m'aider, ça serait très sympa.


Avatar
Fred Pichaut
Suivant le schéma des tables, leurs taille et quand doit être fait la
synchronisation, je suggère:



1)

drop table_cible

select * into table_cible from table_source



2) créer une publication de la table_source est y abonner la table_cible

C'est une réplication transactionnelle. Les modifications de la table source
seront obligatoirement répercutées sur la table cible. Le faire par script,
il n'est pas sure que l'interface graphique le permette.


--
Cdlt,

FP

"le_scrameustache" wrote in
message news:
Bonjour,

j'ai besoin d'un avis sur la methodologie à mettre en place afin de faire
une misa à jour d'une table en fonction d'une autre. Je tiens à préciser


que
je ne peux utiliser de triggers, mais je souhaiterais cependant avoir une
méthode rigoureuse.

Je possède deux tables, l'une est "table_source", l'autre est


"table_cible".
Chacune à la même structure.

J'aimerais pouvoir mettre à jour la table_cible à partir de table_source.
Ainsi, si la ligne de table_source est dans table_cible, je ne fais rien,


si
la ligne n'existe que dans table_source mais pas dans table_cible,


j'insère,
et enfin, s'il existe une modification quelconque de la ligne (hormis l'ID
qui est clé primaire) je mets à jour la ligne dans la table_cible.

Voici mon code qui ne marche pas en cas de modifiaction d'une ligne de la
table_source car ce code insère dans ce cas un doublon dans la


table_cible.

Citation:
insert into table_cible select * from table_source where not exists
(select * from table_cible where and table_source.id = table_ref.id
table_source.champ1 = table_ref.champ1 and table_ref.champ2 > table_source.champ2)


Alors, je ne sais pas la méthodologie la plus efficace et optimisée à
employer pour faire ce test. Faire un long test en comparant l'ID, puis le
contenu de chaque champ, ne me semble pas très beau!

Si quelqu'un pouvait m'aider, ça serait très sympa.


Avatar
si il possede un historique dans cible qui n'est pas
present dans source, ca risque d'etre genant si il drop la
table, non?

il lui faudrait une synchronisation de depart entre
source/cible non?


-----Message d'origine-----
Suivant le schéma des tables, leurs taille et quand doit


être fait la
synchronisation, je suggère:



1)

drop table_cible

select * into table_cible from table_source



2) créer une publication de la table_source est y abonner


la table_cible

C'est une réplication transactionnelle. Les modifications


de la table source
seront obligatoirement répercutées sur la table cible. Le


faire par script,
il n'est pas sure que l'interface graphique le permette.


--
Cdlt,

FP

"le_scrameustache"


wrote in
message news:15D2B031-4F5E-42F1-94B2-



Bonjour,

j'ai besoin d'un avis sur la methodologie à mettre en




place afin de faire
une misa à jour d'une table en fonction d'une autre. Je




tiens à préciser
que
je ne peux utiliser de triggers, mais je souhaiterais




cependant avoir une
méthode rigoureuse.

Je possède deux tables, l'une est "table_source",




l'autre est
"table_cible".
Chacune à la même structure.

J'aimerais pouvoir mettre à jour la table_cible à




partir de table_source.
Ainsi, si la ligne de table_source est dans




table_cible, je ne fais rien,
si
la ligne n'existe que dans table_source mais pas dans




table_cible,
j'insère,
et enfin, s'il existe une modification quelconque de la




ligne (hormis l'ID
qui est clé primaire) je mets à jour la ligne dans la




table_cible.

Voici mon code qui ne marche pas en cas de modifiaction




d'une ligne de la
table_source car ce code insère dans ce cas un doublon




dans la
table_cible.

Citation:
insert into table_cible select * from table_source




where not exists
(select * from table_cible where and table_source.id =




table_ref.id
table_source.champ1 = table_ref.champ1 and




table_ref.champ2 =
table_source.champ2)


Alors, je ne sais pas la méthodologie la plus efficace




et optimisée à
employer pour faire ce test. Faire un long test en




comparant l'ID, puis le
contenu de chaque champ, ne me semble pas très beau!

Si quelqu'un pouvait m'aider, ça serait très sympa.




.



Avatar
le_scrameustache
Merci pour vos réponses. Je ne peux utiliser de triggers ni de réplication.
Voila ce que j'ai fais, qu'en pensez-vous?

*******************************************************
Citation:
---------
create table #id (id int) // table tempo dans la quelle je stocke les id des
lignes modifiées qu'il faudra supprimer

insert into #id select id from table_source where not exists (select * from
table_cible where table_source.id = table_cible.id and table_source.champ1 =
table_cible.champ1) //insertion dans la table tempo des id concernées

delete from table_cible where table_cible.id in (select #id.id from #id) //
suppression des lignes afin de réinsérer par la suite ces nouvelles lignes
modifiées

insert into table_cible select * from table_source where not exists (select
* from table_cible where where table_source.id = table_cible.id and
table_source.champ1 = table_cible.champ1) //insertion des lignes modifiées !

drop table #id

********************************************************

si vous avez des améliorations, critiques, faites m'en part. Merci