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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.
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.
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" <le_scrameustache@discussions.microsoft.com> wrote in
message news:15D2B031-4F5E-42F1-94B2-C2DC4B987502@microsoft.com...
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.
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.
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.
.
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"
<le_scrameustache@discussions.microsoft.com> wrote in
message news:15D2B031-4F5E-42F1-94B2-
C2DC4B987502@microsoft.com...
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.
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.
.
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 !
si vous avez des améliorations, critiques, faites m'en part. Merci
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 !
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 !