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

Eléphanteau du PHP | 20 Messages

26 sept. 2012, 10:39

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

Eléphanteau du PHP | 35 Messages

27 sept. 2012, 11:51

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 ?
La paresse est mère du génie.

Eléphanteau du PHP | 20 Messages

27 sept. 2012, 13:17

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.

Eléphanteau du PHP | 35 Messages

27 sept. 2012, 13:27

Ç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 ?
La paresse est mère du génie.

Eléphanteau du PHP | 20 Messages

27 sept. 2012, 13:54

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:

Eléphanteau du PHP | 35 Messages

27 sept. 2012, 14:01

J'essaie de suivre #-o
Tu aurais un exemple de comment se présente tes données ? données de méta-table ?
La paresse est mère du génie.

Eléphanteau du PHP | 20 Messages

27 sept. 2012, 16:09

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...
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Eléphanteau du PHP | 35 Messages

27 sept. 2012, 16:18

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.
La paresse est mère du génie.

Eléphanteau du PHP | 20 Messages

27 sept. 2012, 16:21

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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Eléphanteau du PHP | 35 Messages

27 sept. 2012, 16:26

Dans tes méta données tu n'as pas les infos sur les clés étrangères ? Je vois que les PK
La paresse est mère du génie.

Eléphanteau du PHP | 20 Messages

27 sept. 2012, 16:33

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...

Eléphanteau du PHP | 35 Messages

27 sept. 2012, 16:36

Quelle structure as tu déjà imaginée ?
La paresse est mère du génie.

Eléphanteau du PHP | 20 Messages

27 sept. 2012, 16:40

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.

Eléphanteau du PHP | 20 Messages

27 sept. 2012, 16:45

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é...

Eléphanteau du PHP | 35 Messages

27 sept. 2012, 16:57

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 ?
La paresse est mère du génie.