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
je crée ensuite 3 rôles contenant chacun deux packages comme ceci
et
je les associe dans l’ordre suivant sur mon ordinateur :
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é :
- TST00001:Program
- TST00002:Program
- TST00001:XX – Program
- TST00002:XX – Program
- TST00001:ZZ – Program
- TST00002:ZZ – Program
- TST00001:YY – Program
- TST00002:YY - Program
or j’obtiens le résultat suivant :
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
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
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 ! :)