Base de données MDT : Comment réorganiser les résultats de requêtes

Bonjour à tous,

un consultant intervenant avec moi chez un client m’a soumis une requête interressante concernant l’ordre dans lequel était organisé les résultats des requêtes faits à la base MDT.

A premiere vue, pas de quoi sauter au plafond mais en y regardant bien, la demande portait sur l’ordre d’installation de packages SCCM disséminés dans plusieurs endroits.

Voici un exemple concret :

je crée un objet ordintateur dans la base MDT et je lui associe 2 packages comme ceci

image

je crée ensuite 3 rôles contenant chacun deux packages comme ceci

image

image

et

image

je les associe dans l’ordre suivant sur mon ordinateur :

image

Enfin, je configure mon customsettings.ini pour aller requêter d’abord les “computer settings” puis les “computer packages”, les “computer roles” et enfin les “role packages” dans cet ordre comme ceci

[Settings]
Priority=CSettings, CPackages, CRoles, RPackages, Default

Je lance un ZTIGather et je m’attends à obtenir les packages dans l’ordre que j’ai spécifié :

  1. TST00001:Program
  2. TST00002:Program
  3. TST00001:XX – Program
  4. TST00002:XX – Program
  5. TST00001:ZZ – Program
  6. TST00002:ZZ – Program
  7. TST00001:YY – Program
  8. TST00002:YY - Program

or j’obtiens le résultat suivant :

image

La raison est simple, la requête effectuée par le ZTIGather est la suivante :

SELECT * FROM RolePackages WHERE ROLE IN ('XX - Application 3', 'YY - Application 2', 'ZZ - Application 1') ORDER BY Sequence

image

Il apparait clairement que la notion de séquence n’est pas bonne puise qu’elle est propre à chaque rôle !!

En fait, c’est tout a fait logique, la bonne requête aurait du être la suivante :

SELECT        rp.Role, rp.Type, rp.ID, rp.Sequence, rp.Packages, cr.Sequence AS RoleSequence
FROM            RolePackages AS rp INNER JOIN
                         ComputerRoles AS cr ON rp.Role = cr.Role
WHERE        (rp.Role IN ('XX - Application 3', 'YY - Application 2', 'ZZ - Application 1'))
ORDER BY RoleSequence, rp.Sequence

image

De manière à obtenir les packages de chaque role, mais également dans l’ordre des roles affectés  à la machine.

La bonne solution est donc de créer une nouvelle vue ou une procédure stockée pour répondre à ce type de besoins/

A vos éditeurs SQL ! :)