Page 1 sur 3

Génération auto des contraintes d'intégrites dans une BDD

Posté : 26 sept. 2012, 10:39
par Nanard
Bonjour à tous,

C'est mon premier message. J'espère poster au bon endroit sinon veuillez pardonner mon manque d'expérience !

Je travaille sur une application de réplication de données entre un système SAP distant et une base Oracle. J'utilise le connecteur SAPRFC, c'est une merveille. Il est inutile de préciser, je pense, que je programme en PHP.

J'ai besoin de créer un script qui devra répliquer un schéma de base en provenance de SAP, c'est à dire recopier les tables et les données en base et générer automatiquement les contraintes d'intégrités. Le but est de recopier l'architecture de certains packages SAP afin de les anonymiser (scrambling). Les contraintes sont donc indispensables pour répercuter les changements sur l'ensemble de la base.

Je cherche une idée : comment agencer les données en base pour générer facilement les liens avec les bonnes relations ? Une hiérarchie ? Existe-t-il un plugin, framework, ou un wiki quelque part à ce sujet ?

Merci aux bonnes âmes.
A plus.
David

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 11:51
par guitoup
Hello,

Est-ce que les contraintes d'intégrités sont déjà présentes dans ta base SAP ? Si oui est-ce que exporter un dump complet de la structure de la base (avec ou sans données selon) et de le re importer directement avec ne serait pas plus simple ?

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 13:17
par Nanard
Bonjour guitoup,

Oui, les contraintes y figurent, sous une forme différente de celle qu'on trouve communément sur une BDD relationnelle mais on peut les trouver.
Le but est de produire une application "tout en main" sans manipuler SAP (cahier des charges). SAP permet de consulter les données quel que soit leur type et de se connecter à sa plateforme par le protocole RFC.

Donc, je peux récupérer ce qui m'intéresse mais de façon désorganisée, "unitaire" et sans rôle précis, à la différence du DUMP qui organise ses données de sorte que l'on puisse les réutiliser en l'état. C'est donc à moi d'élaborer une architecture "maison" pour agencer correctement les données et automatiser la re-création des contraintes, une fois les données rapatriées.

C'est un problème qui s'est posé plusieurs fois pour certains internautes sur différents forums, sans réponses.

Merci à toi.

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 13:27
par guitoup
Ça devient compliqué effectivement (mais c'est ça qui est intéressant ;)), est-ce que Oracle te permet d'avoir accès aux "méta-tables" ? Peut être peux-tu y accéder et lire les différentes contraintes pour les copier ?
Aucune possibilité d'avoir des bases de données liées en maître-esclave / maître-maître et de les synchroniser sur la partie structure ?

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 13:54
par Nanard
Alors non ! Je n'ai aucun moyen d'attaquer directement les tables Oracle. Je n'y ai pas accès. Tout SAP est sur un sous-réseau isolé par un routeur, uniquement accessible sur le port 3299 (RFC). Même mes droits sur le système sont réduits. Je ne peux QUE consulter les données en passant impérativement par les BAPIs de SAP et les reproduire à distance.

Je peux accéder aux méta-données mais sous forme de données, j'entends par là que je lis la donnée mais je perds la structure. Charge à moi d'élaborer une architecture en BDD, installée ailleurs, et de produire une table ou seront stockées à la fois les champs, les types, etc... et les cléfs sous forme de noms d'autres tables à checker...

Tu suis ? :mrgreen:

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 14:01
par guitoup
J'essaie de suivre #-o
Tu aurais un exemple de comment se présente tes données ? données de méta-table ?

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:09
par Nanard
J'ai fait des impressions écrans, ce sera plus simple.

J’interroge par exemple la table SFLIGHT (gestion des vols).
Sous SAP, il faut interroger plusieurs tables différentes pour accéder aux données et méta-données.

Cela se présente sous la forme suivante :

-Données de la table SFLIGHT

[attachment=2]Sane.png[/attachment]

- Méta-données de la table SFLIGHT (partielles):

[attachment=1]SFLIGHT (2).png[/attachment]

- Récupération finale dans une page HTML à l'aide PHP avec le connecteur SAPRFC:

[attachment=0]SFLIGHT.png[/attachment]

Voilà. Pour les méta-données, c'est le même principe, j'interroge une table et récupère les (méta-)données dans une page HTML, puis insertion en base...

Je suis limité en impression écran...

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:18
par guitoup
Est-ce qu'il serait imaginable d'avoir un algo dans le genre :

Pour chaque champs :

contraintes = null;
Récupérer les infos du champs dans la table méta données

Si primary key :
contraintes .= add constraint primary key (champs)

Si foreign key :
contraintes .= add constraint foreign key (champs) references table(champsReference)
Pour le champs references on peut imaginer une table de mapping type : mapping[champs] = champsReference

executer la requêtes de contraintes sql



etc pour chaque type de contrainte que tu rencontres.

C'est long et fastidieux mais je ne vois que ça pour le moment.

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:21
par Nanard
Re !

Les méta-données :
SFLIGHT3.png
Et je récupère ces méta-données, une par une pour les soit les afficher ou les insérer en base, dans une table.

Ma problématique : élaborer une table contenant les méta-données de sorte que je puisse les recréer facilement une fois la table SFLIGHT et les tables dépendantes recopiée localement.

Exemple de table Oracle contenant les méta-données SFLIGHT :
oracle.png

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:26
par guitoup
Dans tes méta données tu n'as pas les infos sur les clés étrangères ? Je vois que les PK

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:33
par Nanard
Est-ce qu'il serait imaginable d'avoir un algo dans le genre :

Pour chaque champs :

contraintes = null;
Récupérer les infos du champs dans la table méta données

Si primary key :
contraintes .= add constraint primary key (champs)

Si foreign key :
contraintes .= add constraint foreign key (champs) references table(champsReference)
Pour le champs references on peut imaginer une table de mapping type : mapping[champs] = champsReference

executer la requêtes de contraintes sql



etc pour chaque type de contrainte que tu rencontres.

C'est long et fastidieux mais je ne vois que ça pour le moment.
C'est ce que je cherche.
Le souci c'est que pour une table, je dois récupérer les autres tables dont elle est dépendante non pas seulement pour propager les changements des données suite au scrambling mais surtout pour récupérer les noms des tables concernées par le data-element ROLLNAME.

La clef étrangère fait référence à un élément et non pas une table. Et cet élément référence une autre table. A moi de tout récupérer et de faire le mapping. Il y a une étape supplémentaire par rapport à une BDD classique.
Du coup, je me perds assez vite et je n'arrive pas à imaginer une structure de table optimisée qui regrouperait tout...

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:36
par guitoup
Quelle structure as tu déjà imaginée ?

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:40
par Nanard
Dans tes méta données tu n'as pas les infos sur les clés étrangères ? Je vois que les PK
Les méta-données, il faut faire un mapping :

Table d'origine : "table1"
Dépendance : "table2"
lien vers : "->"

Les infos que je récupère se présentent de la sorte :

table1 -> table2
table1 -> data-element (ROLLNAME)

table2 -> data-element
data-element -> champs concerné par la clef étrangère.

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:45
par Nanard
Quelle structure as tu déjà imaginée ?
J'ai imaginé une table regroupant toute ces infos.
Pour ça, je dois interroger la table des méta données de la table d'origine, et de toutes les tables dont elle est dépendante. Je dois regrouper toutes ces infos et faire le mapping.

Autre problème, je ne peux pas faire de jointure sur SAP. Je ne peux que lire et/ou récupérer les données telles qu'elle me sont présentées. Charge à moi de les recopier localement chez moi et de réaliser des requêtes optimisées.

Question : Dois-je créer autant de tables de méta-données sur Oracle que de tables à checker ? Tout regrouper sur une seule ? Selon le nombre de tables, cela monte vite en complexité...

Re: Génération auto des contraintes d'intégrites dans une BD

Posté : 27 sept. 2012, 16:57
par guitoup
Aucune jointure ?... vive la complexité !

Pour le nombre de tables c'est une bonne question, moi j'aurais tendance à reproduire le même fonctionnement que Oracle. Si il fait une table de méta données pour chaque table je ferais pareil. Après ça reste mon avis...

Si peux pas faire de jointure faut passer par plusieurs requêtes... La jointure sur le champs ROLLNAME est fiable ?