Le problème que j’ai rencontré aujourd’hui, c’est : “comment migrer tout un projet SSIS d’un serveur à un autre”.
Je suis en SQL Server 2008 R2 et donc je ne bénéficie pas de la notion de « projet » dans le catalogue SSIS. J’ai donc plus de 200 packages répartis dans une arborescence à déplacer.
Ces packages ont été déployés tout au long de la vie du projet et en tant qu’admin, je ne souhaite pas solliciter l’équipe de développement pour me packager un script de livraison qui reprendrait tous les packages.
Après tout, le changement d’un serveur pour un autre, c’est une opération de DBA, pas de développeur donc je dois trouver une solution.
Il y a un utilitaire fourni avec SQL Server qui permet de manipuler des packages : DTUTIL.exe
Il permet de batcher des opérations sur un catalogue SSIS (2008 / 2008R2) donc cela semble une bonne piste.
Pour déplacer un package, la ligne de commande ressemble à cela :
dtutil /sql \chemin\package /SourceServer SERVSOURCE /copy SQL;\ chemin\package /DestServer SERVDEST
Le problème, c’est qu’il faut que j’écrive plus de 200 fois cette ligne de commande, avec les bons chemins.
Comme je suis faignant, je vais passer par les méta-données de MSDB et en particulier avec les tables sysssispackages et sysssispackagefolders.
Il va falloir faire du hiérarchique pour reconstruire l’arborescence, pour cela, un bonne CTE des familles (cc Philippe).
Voici le script :
;with PackagesHierarchy(folderId, ParentFolderId, FolderPath) as ( select folderid, cast(null as uniqueidentifier), cast('\'+foldername as varchar(max)) as FolderPath from sysssispackagefolders where foldername = 'ProjectFolder' union all select sysssispackagefolders.folderid, sysssispackagefolders.parentfolderid, CAST(PackagesHierarchy.FolderPath +'\'+ sysssispackagefolders.foldername as varchar(max)) as FolderPath From sysssispackagefolders Inner Join PackagesHierarchy on sysssispackagefolders.parentfolderid = PackagesHierarchy.folderid ) Select 'dtutil /sql ' + FolderPath + '\' + name + ' /SourceServer ServSRC /copy SQL;' + FolderPath + '\' + name + ' /DestServer ServDEST' From sysssispackages Inner Join PackagesHierarchy On PackagesHierarchy.folderId = sysssispackages.folderid
Vous copiez tout cela dans un fichier BAT et let’s go !
Conclusion
Certains diront qu’il est préférable de déployer en mode Fichier. Moi, je ne prends pas parti
Enjoy.
Très bon post et très utile. les temps de transfert sont-ils bon avec cette méthode si on se base sur ces 200 packages?
Je ne me souviens plus du temps que ça a pris mais j’étais à quelques dizaines de minutes environ. Moins d’une heure je dirais.