Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/02/2012, 15h00   #1
Invité de passage
 
Homme
Développeur .NET
Inscription : février 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Distribution

Informations forums :
Inscription : février 2012
Messages : 9
Points : 2
Points : 2
Par défaut [SQL2005] Regrouper les données de plusieurs bases dans une seule

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

oliviera63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 17h14   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 470
Points : 2 470
Envoyer un message via Yahoo à zinzineti
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) ?
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 00h44   #3
Membre du Club
 
Inscription : juin 2007
Messages : 115
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 115
Points : 41
Points : 41
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 !
azur668 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 21h43   #4
Invité de passage
 
Homme
Développeur .NET
Inscription : février 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Distribution

Informations forums :
Inscription : février 2012
Messages : 9
Points : 2
Points : 2
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
oliviera63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 22h09   #5
Membre du Club
 
Inscription : juin 2007
Messages : 115
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 115
Points : 41
Points : 41
Citation:
Envoyé par oliviera63 Voir le message
... WHERE Col1 NOT IN (SELECT Col1 FROM MaBase.MaTable)
Code :
... WHERE NOT EXISTS (SELECT * FROM MaBase.MaTable WHERE MaBase.MaTable.Col1 =  [AdressIP].[BasedeDonnées].MaTable.Col1
me semble plus approprié, le NOT IN est réputé lent
azur668 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 22h51   #6
Invité de passage
 
Homme
Développeur .NET
Inscription : février 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Distribution

Informations forums :
Inscription : février 2012
Messages : 9
Points : 2
Points : 2
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
oliviera63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h10   #7
Membre du Club
 
Inscription : juin 2007
Messages : 115
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 115
Points : 41
Points : 41
Citation:
Envoyé par oliviera63 Voir le message
Sur le serveur, j'ai une base de structure identique à celle des systèmes, sans clefs, contraintes d'unicite etc...
Il faudrait quand même une clef primaire, sans quoi impossible de différencier les nouvelles lignes des anciennes !

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 :
1
2
3
4
5
6
7
8
INSERT INTO MaBase.Matable  (AdressIP,col1, Col2, col3, ...)
SELECT (AdressIP,col1, Col2, col3, ...) 
FROM  [AdressIP].[BasedeDonnées].MaTable 
WHERE NOT EXISTS (
    SELECT * FROM MaBase.MaTable 
    WHERE MaBase.MaTable.Col1 =  [AdressIP].[BasedeDonnées].MaTable.Col1
    AND MaBase.MaTable.IDbase = AdressIP
)
Et tu devra rajouter cette colonnes dans les requetes sur la base globale dans les jointures clé primaire / clé étrangère
azur668 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 10h40   #8
Invité de passage
 
Homme
Développeur .NET
Inscription : février 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Distribution

Informations forums :
Inscription : février 2012
Messages : 9
Points : 2
Points : 2
Un grand merci pour ta précieuse aide.

Oliviera63
oliviera63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h54.


 
 
 
 
Partenaires

Hébergement Web