Un de mes besoins client est de pouvoir automatiser la création de partitions ainsi que le process des objets SSAS. Je me suis donc lancé à la recherche d'une solution existante et j'ai trouvé ça => Article SSAS-INFO mais comme d'habitude lorsque l'on veut réutiliser, cela ne convient pas complètement à mon besoin :
Me voici donc lancé pour la réalisation d'une base SQL + Package SSIS + Script AMO (en C#) pour réaliser les actions suivantes:
Pour ce faire, j'ai créé un modèle de base de données un peu complexe je vous l'accorde, mais heureusement, j'ai aussi fait les procédures stockées qui permettent de remplir simplement les tables.
Ci-dessous, le schéma de l'architecture:
Ci-dessous le schéma de la base de données :
Afin de remplir toutes ces tables, nous utiliserons la procédure stockée AddSSASObject disponible dans la section telechargement.
EXEC [dbo].[AddSSASObject](@ProjectName NVARCHAR(255) , @ObjectType NVARCHAR(255) , @DatabaseName NVARCHAR(255) , @CubeName NVARCHAR(255) , @measureGroupName NVARCHAR(255) , @DataSourceID NVARCHAR(255) , @PartitionName NVARCHAR(255) , @SQLQuery NVARCHAR(4000) , @MDXSlice NVARCHAR(4000) , @DimensionName NVARCHAR(255) , @objectID INT = 0 OUTPUT)
Cette procédure prend en paramètres :
La procédure stockée retourne l'@objectID créé
Exemple :
Ma base contient uniquement le projet "JeanMichProject" et je veux ajouter la partition "JeanNoPartoch" voici l'appel à la procédure à exécuter :
EXEC dbo.AddSSASObject 'JeanMichProject' ,'Partition' ,'MaDatabase' ,'MonCube' ,'MonMeasureGroup' ,'MaDataSource' ,'JeanNoPartoch' ,'SELECT * FROM MaTable' ,NULL ,NULL
La base étant vide, la procédure va me remplir:
Puis elle va créer l'objet qui lie l'ensemble au projet et retourner son ID
Si par la suite je lance la procédure suivante :
EXEC dbo.AddSSASObject 'JeanMichProject' ,'Partition' ,'MaDatabase' ,'MonCube' ,'MonMeasureGroup' ,'MaDataSource' ,'JeanBOBPartoch' -- Autre partition ,'SELECT * FROM MaTable' ,NULL ,NULL
Deux lignes seront ajoutées en base, la ligne relative à la partition 'JeanBOBPartoch et la ligne relative à l'objet.
Une fois ces informations saisies, il me faut encore spécifier quelles actions effectuer sur ces objets et quand les exécuter c'est là qu'intervient la procédure PlanAction :
EXEC [dbo].[PlanAction](@objectID INT , @recurrenceType NVARCHAR(50) = 'Weekly' , @dayOfTheMonth INT , @dayID INT , @isActivated BIT , @ActionType NVARCHAR(255))
Cette procédure prend en paramètres :
Donc si je veux que ma partition JeanMich soit processée tous les lundi j'exécute la procédure suivante :
EXEC dbo.PlanAction 125 ,'Weekly' ,NULL ,2 ,1 ,'Process Full'
Et voilà notre base de données est remplie avec les champs suffisant pour créer/processer ma partition. (Créer car si je met un process sur une partition non existante, le script AMO va créer cette partition)
Il faut maintenant mettre à disposition à notre package SSIS un moyen simple d'acceder à ce merdier nos données nous allons créer deux vues.
La première (disponible dans la section telechargement) nous permet d'obtenir tous les enregistrements planifiés :
SELECT [ProjectID] ,[ProjectName] ,[Serveur] ,[ProjectPriority] ,[ObjectID] ,[ObjectTypeID] ,[ObjectTypeName] ,[ObjectTypePriority] ,[DatabaseID] ,[DatabaseName] ,[ActionTypeID] ,[RecurrenceType] ,[DayOfTheMonth] ,[DayID] ,[isActivated] ,[ActionGroup] ,[ActionName] ,[ActionTypePriority] ,[CubeID] ,[CubeName] ,[DimensionID] ,[DimensionName] ,[MeasureGroupID] ,[MeasureGroupName] ,[DataSourceID] ,[MDXSlice] ,[PartitionID] ,[PartitionName] ,[SQLQuery] FROM [SSAS_Configurations].[dbo].[ObjectListing]
La seconde nous retourne uniquement les enregistrement éligibles pour une action aujourd'hui, elle est basée sur la vue précédente mais à la clause suplémentaire suivante :
ALTER VIEW [dbo].[ObjectListingForToday] AS SELECT * FROM ObjectListing O WHERE isActivated = 1 AND ( ( RecurrenceType = 'Monthly' AND O.DayOfTheMonth = DATEPART(DAY, GETDATE()) ) OR ( ( RecurrenceType = 'Weekly' AND O.DayID = DATEPART(WEEKDAY, GETDATE()) ) ) OR (RecurrenceType = 'OnDemand') )
Notre lot SSIS recevra donc toutes les informations nécessaires pour traiter les objets du jour!
Sur le lot SSIS je me suis un peu enflamé sur les foreach, mais c'est pour mieux séparer mes différents éléments et pouvoir paralléliser le process des partitions.
Il n'y a en théorie rien à configurer sur ce package pour qu'il s'adapte à votre environnement, il est essentiellement composé d'une script task qui va traiter nos éléments.
La script task est composée de 9 classes et 1 interface.
Vous trouverez le détail du code en téléchargement.
Le zip complet ici => Cube Builder V0.2 <=
Changelog Version 0.2:
Le zip complet ici => Cube Builder V0.1 <=
Il contient:
Encore une fois, il s'agit ici que d'une version non terminée sur laquelle il est possible d'ajouter des milliards de choses :)
Charles-Henri Sauget , Expert B.I. et Développeur contact@sauget-ch.fr
Le blog qui parle de Business Intelligence Microsoft, Informatique décisionnel, SQL Server 2005 à 2012, S.S.I.S., S.S.R.S., S.S.A.S., PowerPivot, PowerView, Journées SQL Server, G.U.S.S., SQLBits, TechDays, Sharepoint 2010 et bien plus encore :)
Commentaires