IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSLT] Génération d'un code sql pour une suppression en cascade dans BDDR


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 7
    Points
    7
    Par défaut [XSLT] Génération d'un code sql pour une suppression en cascade dans BDDR
    Je travaille avec une base de données relationnelle sql server 2000 dont l'utilisation de clé étrangère déclarée en DELETE ON CASCADE est interdite par l'administrateur. Je souhaite utiliser XSLT pour générer un code sql qui me permettrait de supprimer en cascade l'enregistrement d'une table ainsi que tous les enregistrements des tables qui lui sont reliés.

    L'idée est la suivante.

    1. je génère (OPEN XML sous sql server) le fichier XML correspondant à une requête sql qui contient tous les enregistrements que je souhaite supprimer.
    2. Transformation 1 : je mets à plat le fichier XML en classant correctement les noeuds (les premiers noeuds du fichier XML correspondraient aux tables les plus basses dans ma structure de base de données) car il faudra supprimer ces enregistrements en premier pour respecter les contraintes référentielles.
    3. Transformation 2 : je génère les instructions DELETE TABLE WHERE clé = xxx à partir de ce fichier.

    Existerait-il un lien internet qui traite de ce sujet (j'ai beaucoup cherché et je n'ai rien trouvé) ? Je n'ai jamais utilisé les Schémas XML mais il me semble qu'ils permettraient de réaliser ce type d'opération (il faut être capable de connaître la clé de chaque table (noeud) pour les étapes 2 et 3).

    Merci.

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Il n'y a pas nécessairement besoin de xml schéma.
    Si le fichier à toujours la même structure (et je ne parle pas du nom des éléments) ont peut baser le xslt dessus

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    D'accord, je génère mon fichier XML et essaie d'écrire le code XSLT avant de revenir sur le forum (car je ne pense pas y arriver du premier coup !)

    RQ : J'utilise Power AMC pour modéliser la BDDR. Je pensais qu'il y aurait déjà eu une réflexion sur ce type de problème et que j'aurais pu générer le Schéma XML par power AMC en sélectionnant toutes les tables impliquées dans ma requête et qu'en associant ce schéma à une feuille XSLT qui va bien que j'aurais pu obtenir mes lignes de code de suppression.

    J'essaie donc d'écrire mes deux transformations.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonsoir,

    J'y suis presque mais je n'arrive pas à conclure pour ma première transformation.

    Voici un exemple de fichier XML de départ avec 2 niveaux : une table1 reliée à une table2 qui est elle-même reliée à une table3. La table1 est également reliée à une table2bis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <?xml version="1.0" encoding="utf-8"?>
    <root>
     
      <table1 cle1="10000" pere="pere1">
           <table2 cle2="30" titre="titre1">
                 <table3 nom="nom1"/>
                 <table3 nom="nom2"/>
                 <table3 nom="nom3"/>
           </table2>
     
          <table2 cle2="31" titre="titre2">
                  <table3 nom="nom1"/>
                  <table3 nom="nom2"/>
                  <table3 nom="nom3"/>
          </table2>
      </table1>
     
      <table1 cle1="10001" pere="pere2">
           <table2 cle2="32" titre="titre1">
                  <table3 ville="ville1"/>
                  <table3 ville="ville2"/>
                  <table3 ville="ville3"/>
           </table2>
     
           <table2 cle2="33" titre="titre2">
                  <table3 ville="ville1"/>
                  <table3 ville="ville2"/>
                  <table3 ville="ville3"/>
           </table2>
     
        <table2bis rubrique="rubrique1">
                  <table3 ville="ville1"/>
                  <table3 ville="ville2"/>
                  <table3 ville="ville3"/>
        </table2bis>
     
      </table1>
    </root>
    Dans la représentation hiérarchique XML, je perds en attributs les clés de mon modèle relationnel. Il faut donc parcourir l'arbre des noeuds en copiant la clé du noeud supérieur. Je décide de parcourir l'arbre en partant des noeuds les plus bas car quand je vais créer ensuite les delete (dans la seconde transformation) il faut que je commence à supprimer les enregistrements des noeuds les plus bas.

    Voici donc le code xslt pour essayer de réaliser cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    		<xsl:template match="/">
    			<root>
                                    <xsl:apply-templates select="/*/*/*"/>        
    				<xsl:apply-templates select="/*/*"/>
    			</root>
    		</xsl:template>
     
    		<xsl:template match="table1">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    		</xsl:copy>
     
     
    	</xsl:template>
     
    	<xsl:template match="table2 | table2bis ">
     
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    			<xsl:attribute name="cle1"><xsl:value-of select="../@cle1"/> </xsl:attribute>
    		</xsl:copy>
     
    	</xsl:template>
     
      <xsl:template match="table3">
     
        <xsl:copy>
          <xsl:apply-templates select="@*"/>
          <xsl:attribute name="cle2">
            <xsl:value-of select="../@cle2"/>
          </xsl:attribute>
          <xsl:attribute name="cle1">
            <xsl:value-of select="../../@cle1"/>
          </xsl:attribute>
        </xsl:copy>
     
      </xsl:template>
     
    	<xsl:template match="@*">
    		<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
    	</xsl:template>
    </xsl:stylesheet>
    ça marche pour les tables de niveau 1 et 2 (c'est à dire table1, table2 et table2bis) mais pas pour la table de niveau 3 (c'est à dire table3) pourtant je fais bien <xsl:apply-templates select="/*/*/*"/>

    Voici ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <table2 cle2="30" titre="titre1" cle1="10000" />
      <table2 cle2="31" titre="titre2" cle1="10000" />
      <table2 cle2="32" titre="titre1" cle1="10001" />
      <table2 cle2="33" titre="titre2" cle1="10001" />
      <table2bis rubrique="rubrique1" cle1="10001" />
      <table1 cle1="10000" pere="pere1" />
      <table1 cle1="10001" pere="pere2" />
    </root>
    et je ne comprends pas pourquoi ça ne marche pas.

    Merci pour votre aide.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonsoir,

    Voilà, j'ai finalement essayé de mettre un niveau de plus dans le parcours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="/*/*/*/*"/>        
    	<xsl:apply-templates select="/*/*/*"/>
            <xsl:apply-templates select="/*/*"/>
        </root>
    </xsl:template>
    ...et ça marche. J'ai bien le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <table3 nom="nom1" cle2="30" cle1="10000" />
      <table3 nom="nom2" cle2="30" cle1="10000" />
      <table3 nom="nom3" cle2="30" cle1="10000" />
     
      <table3 nom="nom1" cle2="31" cle1="10000" />
      <table3 nom="nom2" cle2="31" cle1="10000" />
      <table3 nom="nom3" cle2="31" cle1="10000" />
     
      <table3 ville="ville1" cle2="32" cle1="10001" />
      <table3 ville="ville2" cle2="32" cle1="10001" />
      <table3 ville="ville3" cle2="32" cle1="10001" />
     
      <table3 ville="ville1" cle2="33" cle1="10001" />
      <table3 ville="ville2" cle2="33" cle1="10001" />
      <table3 ville="ville3" cle2="33" cle1="10001" />
     
      <table3 ville="ville1" cle2="34" cle1="10001" />
      <table3 ville="ville2" cle2="34" cle1="10001" />
      <table3 ville="ville3" cle2="34" cle1="10001" />
     
      <table2 cle2="30" titre="titre1" cle1="10000" />
      <table2 cle2="31" titre="titre2" cle1="10000" />
     
      <table2 cle2="32" titre="titre1" cle1="10001" />
      <table2 cle2="33" titre="titre2" cle1="10001" />
     
      <table2bis cle2="34" rubrique="rubrique1" cle1="10001" />
     
      <table1 cle1="10000" pere="pere1" />
      <table1 cle1="10001" pere="pere2" />
     
    </root>
    Est-ce que quelqu'un peut m'expliquer clairement pourquoi il me faut 4 étoiles ? Merci.


    RQ: dans mon fichier de données en exemple j'avais oublié l'attribut cle2 pour l'élément table2bis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <table2bis cle2="34" rubrique="rubrique1">

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Excusez-moi pour la question car en fait il y a le noeud racine (/), le noeud root (la première étoile), les noeuds table1 (la seconde étoile), les noeuds table2 et table2bis (la troisième étoile) et les noeuds table3 (la quatrième étoile).

    Excusez-moi pour la discussion, le code pourra toutefois intéresser quelqu'un.
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Aide pour code SQL avec une date
    Par Accessifiante dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 27/05/2013, 18h03
  2. Réponses: 1
    Dernier message: 26/03/2008, 22h19
  3. Réponses: 3
    Dernier message: 06/01/2007, 17h44
  4. problème de code javascript pour une vue 360°
    Par tomguiss dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/03/2006, 22h50
  5. Création BD Access Code SQL pour relation 1-1 ?
    Par colorid dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/10/2005, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo