|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Développeur .NET Inscription : février 2012 Messages : 9 ![]() |
Bonjour,
J'ai d'un coté, plusieurs systèmes enregistrant des données. Chaque système enregistre ses données dans sa propre base de données. Le SGBD est SQL SERVER 2005. Je cherche à regrouper les données de tous les systèmes dans une base de données centrale de même structure que les bases systèmes afin d'en exploiter les données. Certaines tables contiennent des clefs primaires / étrangères et des contraintes d'unicité. Les tables sont amenées à contenir quelques centaines de milliers d'enregistrements. Quelle méthode me conseilleriez-vous pour effectuer ceci proprement? Merci d'avance. Oliviera63 |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() |
Depuis le serveur central, tu peux créer des liens vers les autres BD (BD1,BD2,...)
puis simuler MERGE sous SQL SERVER 2005 Vous devez d'abord identifier ce qui permet de mettre à jour une ligne (présence par exemple de colonne date de création, date de modification,....) Concrètement si un même identifiant est présent dans la Table1 (BD1) et Table 1 (BD2) sur quelle(s) colonne(s) de Table1 doit-on se baser pour mettre à jour (UPDATE) cette ligne dans Table1 (BDD centrale) ? |
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : juin 2007 Messages : 115 ![]() |
Je te suggère de créer une base avec la même structure, mais en y appliquant les retouches suivantes :
- Ajoutes une colonne IDbase à chaque table de la base globale - Ajoute cette colonne IDbase à tous les contraintes d'unicité, indexes uniques et clé primaires de la base globale - Retire l'attribut Identity aux colonnes qui en sont dotés - Supprime toutes les contraintes foreign key (les relations) - Eventuellement, supprime les indexes que tu n'utilisera pas pour interroger ta base globale, cela accélérera l'import. - Puis importe successivement toutes les tables de chaque base, en rajoutant l'identifiant de la base source dans la colonne IDbase. Si le volume n'est pas trop important il est plus simple de vider puis réimporter tout à chaque fois, sinon un MERGE est envisageable, mais il faut y énumérer toutes les colonnes susceptibles d'avoir été mises à jour dans la clause WHEN MATCHED, ce qui peut être assez fastidieux, et même se révéler plus lent que le réimport complet ! |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Développeur .NET Inscription : février 2012 Messages : 9 ![]() |
Bonsoir, et un grand merci pour vos réponses.
Sur le serveur, j'ai une base de structure identique à celle des systèmes, sans clefs, contraintes d'unicite etc... A chaque fois que le serveur interroge un des systèmes, c'est uniquement pour récupérer les nouveaux enregistrements car il n'y a jamais de modifications des données (Juste des INSERT sur les tables qui m’intéressent...). Je ne souhaite ajouter que les enregistrements qui ne sont pas encore présent dans la base de données (dans la table plutôt...) Actuellement, je remplis chaque table de cette façon: INSERT INTO MaBase.Matable SELECT (col1, Col2, col3, ...) FROM [AdressIP].[BasedeDonnées].MaTable WHERE Col1 NOT IN (SELECT Col1 FROM MaBase.MaTable) Cette façon de procéder est-elle correcte lorsque la base du serveur contient un très grand nombre de données? ou existe-il un moyen plus simple? Merci encore. Oliviera63 |
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : juin 2007 Messages : 115 ![]() |
Code :
... WHERE NOT EXISTS (SELECT * FROM MaBase.MaTable WHERE MaBase.MaTable.Col1 = [AdressIP].[BasedeDonnées].MaTable.Col1 |
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Développeur .NET Inscription : février 2012 Messages : 9 ![]() |
Re-bonsoir,
Je vais remplacer le NOT IN par NOT EXISTS... Puis-je conclure que ma façon de procéder est appropriée? Merci pour ton aide. Oliviera63 |
|
|
00
|
|
|
#7 | |||
|
Membre du Club
![]() Inscription : juin 2007 Messages : 115 ![]() |
Citation:
De plus, si cette clé primaire est un Identity, ou simplement qu'elle risque de se trouver la même dans plusieurs bases, il est indispensable de rajouter à chaque table la colonne IDbase (avec l'identifiant de ton choix, par exemple AdressIP) : Code :
|
|||
|
|
10
|
|
|
#8 |
|
Invité de passage
![]() Développeur .NET Inscription : février 2012 Messages : 9 ![]() |
Un grand merci pour ta précieuse aide.
Oliviera63 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com