Archive

Archives pour la catégorie ‘Trucs & astuces’

Extraire un PDF à partir d’un BLOB via Informatica

Retour d’expérience projet où notre client souhaitait pousser 12 à 14 000 documents PDF de suivi de planning et d’absentéisme vers une application de mailing.

Ces documents étaient stockés en tant que BLOB (Binary Large Object) dans la base Oracle du portail BI dédié au personnel. Afin de pouvoir pousser ces documents vers les intéressés, nous avons utilisé l’ETL en place : Informatica PowerCenter.

Contexte technique : PDF stockés en BLOB sous Oracle 10g, Informatica PowerMart 8.6.1

Solution : Transformation Java dans le mapping PowerDesigner

Document de Référence :   The Binary Reader and BinaryWriter Java Transformations

Résolution :

Il s’agissait donc de créer un mapping s’appuyant sur la table Oracle contenant le BLOB en question, pour l’extraire vers notre répertoire cible en tant que fichier PDF.

Ce mapping nécessitait au minimum 3 informations :

  • Le nom du fichier à générer
  • Le champ BLOB contenant le PDF
  • Le chemin du répertoire cible, dans notre cas un paramètre du mapping

Mapping d'extraction d'un blob

Mapping d'extraction d'un blob



 
Lire la suite…

Composants additionnels SSIS

SSIS a l’avantage d’être assez ouvert et de pouvoir créer ses propres composants. Notamment lorsque les composants de base ne suffisent pas pour satisfaire nos besoins client, ou pour simplifier un process ETL qui serait bien trop lourd.

C’est dans ce cadre que 5 composants SSIS « made in Homsys » ont vu le jour au fil du temps, et peuvent s’avérer bien utiles dans certains cas.

2 sources de flux de données :

  • Dim Temps Source
  • Dim Géo FR Source

3 transformations :

  • Proper Case
  • Compteur
  • Recherche sur Intervalle

L’ensemble du package est téléchargeable ici :
SSISHomsysComponents_v1.zip

Tous les composants sont dans une seule bibliothèque (DLL) et s’installe facilement. Il existe une version pour SSIS 2005, et une autre pour SSIS 2008.
Chaque composant possède une interface graphique pour le paramétrage, et la doc associée explique leur utilisation.

Plutôt qu’un long discours, je vous invite à parcourt le guide fourni dans le package …

A votre disposition pour d’éventuelles remarques/améliorations/nouvelles idées …

Categories: Trucs & astuces Tags: ,

Implémenter la sécurité COGNOS 10. L’authentification et les droits d’accès

 
 
Mettre en place la sécurité sur COGNOS 10 n’est pas toujours une mince affaire. Il faut d’abord bien comprendre certains principes de base. Il est également important de distinguer l’utilité de chacune des fonctionnalités principales. Enfin, des conseils pour la configuration sont à connaitre pour éviter de rendre l’implémentation de la sécurité longue et laborieuse.

J’ai donc voulu partagé avec ceux que cela pourrait intéresser, certains points de la sécurité COGNOS 10 qu’il faut bien comprendre et connaître avant de commencer la configuration de la sécurité, les concepts de base que l’on retrouve au niveau de l’authentification et des autorisations, cela sous la forme la plus synthétique et la plus facile à mettre en pratique possible.

 

Authentification

Les espace-noms

La mise en place de la sécurité n’est pas obligatoire dans COGNOS 10. Cela signifie que les accès utilisateurs seront en anonyme et dépendront de la configuration par défaut de l’espace-nom intégré COGNOS 10 pour l’utilisateur Anonyme. L’espace-noms intégré de COGNOS contient les objets comme les utilisateurs, les groupes, les rôles et les sources de données.

En plus de l’espace-noms Cognos, chaque ajout d’un nouveau fournisseur d’authentification est représenté par un nouvel espace-noms. La sécurité COGNOS 10 peut être basée sur un ou plusieurs fournisseurs d’authentification. Plusieurs  sont pris en charge comme par exemple active directory server, LDAP, NTLM, etc. (se reporter à la documentation Cognos).

L’espace-noms COGNOS 10 est essentiel. Il ne peut d’ailleurs pas être supprimé dans COGNOS Configuration à la différence de n’importe quel autre espace-noms lié à un fournisseur d’authentification tiers.

     

Les utilisateurs, groupes et rôles

Clarifions ces différents concepts.

L’utilisateur ne peut pas être créé sur le portail COGNOS 10. Toutes les informations (nom, prénom, adresse électronique, etc.) sur l’utilisateur proviendront toujours d’un fournisseur d’authentification.

A noter: Si vous utiliser le fournisseur COGNOS 7, l’utilisateur doit appartenir à au moins une classe d’acces manager pour pourvoir exister dans COGNOS 10.

     

En ce qui concerne les groupes et les rôles, il y a souvent beaucoup de doutes alors que c’est très simple.

Les groupes et les rôles permettent de créer des ensembles organisés d’utilisateurs qui auront les mêmes caractéristiques dans la sécurité. Toutefois il n’est pas possible de se connecter au portail en utilisant le nom du groupe ou du rôle, mais la sécurité relatif à l’utilisateur identifié sera en fonction du ou des groupes/rôles auxquels il appartient.

Ainsi, le groupe et rôle sont quasi identiques exception fait qu’un rôle ne peut pas appartenir à un groupe alors que l’inverse est possible. Le diagramme suivant illustre cette architecture:

 

      

Notez également les points suivants qui sont importants en fonction de votre fournisseur d’authentification.

Si vous n’utilisez pas le fournisseur COGNOS 7 et que vous souhaitez utiliser des groupes importés de votre fournisseur tiers, il vous faudra rajouter ces groupes de votre fournisseur tiers à un groupe ou un rôle de l’espace-noms cognos au risque que ces groupes ne soient pas reconnus par le portail COGNOS.

Si vous utilisez le fournisseur COGNOS 7, les classes utilisateurs vont apparaitre sous forme de rôle sur le portail COGNOS 10.

Comme un utilisateur peut appartenir à plusieurs groupes et rôles sa sécurité correspondra à la fusion de ses différents droits d’accès.

Au sujet de la suppression/création de groupe ou de rôle, le fait de créer un groupe ou un rôle avec le même nom qu’un ancien groupe ou rôle ne permettra pas de récupérer la sécurité supprimée.

Maintenant nous allons parler des droits d’accès, concept qu’il est important de comprendre pour mettre en place une sécurité COGNOS 10.

       

Droits d’accès

L’avantage et l’inconvénient des droits d’accès est qu’ils peuvent être définis sur presque tout, de l’utilisateur aux pages du portail. Il n’y a pas de préconisation particulière sur le meilleur niveau ou positionner les droits à part celle de faire preuve de bon sens, d’avoir des règles de développement bien définis et de positionner les droits, dans la mesure du possible, sur les niveaux supérieures.

Ci-dessous, le récapitulatif de la documentation Cognos des différents droits d’accès.

 

Les droits dont disposera un utilisateur correspondront à la combinaison des droits définit. Au minimum, un utilisateur doit disposer de droit de passage sur les entrées parent (il s’agit de contenant donc par exemple les dossiers, les packs, les groupes, les rôles, etc.) des entrées auxquelles il veut accéder. Si pour une entrée aucun droit n’est défini, l’entrée héritera des droits de son entrée parent.

Pour chaque droit vous pouvez soit donner ou refuser l’accès mais le refus d’accès prend le pas sur l’octroi. En effet, en cas de conflit entre l’octroi et le refus, l’accès est toujours refusé. Il est donc préférable de ne pas cocher des droits plutôt que de les refuser.

Lorsque vous définirez les droits d’une entrée vous verrez la case à cocher « Remplacer les droits d’accès hérités de l’entrée parent ». Cochée, cette case permet de définir précisément les droits de l’entrée en faisant abstraction des droits de l’entrée parent.

Pour illustrer le fonctionnement des droits d’accès, j’ai créé le tableau suivant qui met en face de certaines opérations les droits d’accès nécessaires.

Ces rappels à l’esprit, vous devriez maintenant pourvoir aborder plus sereinement la mise en place de votre sécurité COGNOS 10.

 

    

LW

Envoyer des IDOC SAP avec BODS

Retour d’expérience sur le projet GASPAR pour le groupe PVCP (Pierre & Vacances – Center Parcs).

Dans ce projet le challenge était d’utiliser BODS comme middleware pour envoyer à SAP des écritures (pièces) comptables via la technologie IDOC.

Le contexte :

  • Un système Tiers dépose un fichier plat contenant la facturation client et les comptes d’imputations correspondants,
  • BODS charge ce fichier,
  • BODS traduit les imputations comptables du système tiers en code d’imputation comptable SAP,
  • BODS poste la pièce comptable dans SAP au format IDOC en mode message.

Les solutions :

  • Les utilisateurs métier maintiennent dans SAP des tables de correspondance entre compta système tiers et compta de SAP (hors périmètre de ce post),
  • BODS traduit via des lookup_ext les données d’imputation comptables (hors périmètre de ce post),
  • BODS envoi un IDOC par pièce comptable à SAP en utilisant l’IDOC ACC_DOCUMENT003.

La difficulté majeure résidait dans la génération des IDOC. Un fichier plat pouvant contenir jusqu’à 34000 documents comptables générant autant d’IDOC.

Un IDOC SAP ce présente sous un format de type xml. L’ACC_DOCUMENT003 simule la saisie d’une pièce comptable, il y a de nombreux champs à remplir pour satisfaire SAP, et de nombreux contrôles sont réalisés pour que la pièce comptable soit considérée comme juste.

Ce qui nous intéresse ici est la partie génération de l’IDOC.

Génération massive d’IDOC :

1. Structurer les données pour ce rapprocher du schéma cible :

Deux méthodes ont été utilisées sur le projet, création d’une table par segments d’IDOC, ou division de la table source en autant de query que de segments d’IDOC

Chaque IDOC est référencé par un Identifiant unique, un IDOC peut contenir plusieurs lignes, qui doivent être référencées de manière unique par IDOC.

La table/query d’en-tête ne doit comporter qu’une seule ligne par identifiant d’IDOC, les autres tables/query peuvent contenir plusieurs lignes.

A l’image d’un modèle en étoile les données sont réparties entre : la table d’en-tête (Fait) et les tables de lignes (Dimension).

ci-dessous des données en exemple :

2. Lier les Tables/Query à une en-tête pour générer tous les IDOC en une passe. 

(Dans l’exemple précédent : la query « QRY_MATCH_IDOC »)

La query en amont de l’IDOC (query_2) place les segments dans l’IDOC.

Chaque Tables sources doivent être insérées dans la cible comme schéma.

2.1 L’en-tête :

La clause FROM est déterminante pour structurer l’IDOC. La clause FROM de query_2 aura pour valeur la table d’en-tête.

Puis tous les segments d’en-tête auront comme valeur dans la clause FROM le « Row_Generation ». Cela permet de ne remplir l’en-tête qu’une seule fois. Dans l’exemple ci-dessus les segments EDI_DC40, E1BPACHE09 et E1BPACEXTC

(détail d’un segment)

2.2 Les lignes :

Les autres segments sont rempli par les tables correspondantes, avec en clause FROM la table, et en clause WHERE le lien vers l’identifiant de l’en-tête

En exemple le segment E1BPACGL09 :

2.3 Cas particulier d’une duplication de segment :

Dans certains cas un segment doit être répété. Lors de la première itération le segment est paramétré à l’identique des autres, et la deuxième itération la clause FROM prendra pour valeur un « ROW_GENERATION ».

 

3. Paramétrage de l’envoi d’IDOC

Afin d’optimiser l’envoi des IDOC en mode message la fenêtre suivant permet de modifier le nombre d’envoi simultané d’IDOC. Deux solutions, par paquet ou par division chronologique.

La solution d’envoyé les IDOC par paquet de 100 a été choisi compte tenu du paramétrage de SAP chez le client.

Conclusion

Cette méthode permet d’envoyer en masse en quelques minutes des milliers d’IDOC.

Certes BODS est détourné de son utilisation première (ETL) pour devenir un modeste intégrateur, néanmoins les performances sont très bonne.

Aujourd’hui la moyenne est : 1 min / 1000 IDOC de type ACC_DOCUMENT003.

Trucs et astuces sur SSRS

Bonjour,

Voici quelques petits trucs et astuces utilisés sur SSRS.

Certaines fonctionnalités ne sont disponibles qu’avec la version 2008 R2 de SQL.

- Pour commencer, une fonction très utile, qui permet de récupérer les valeurs d’une source de données dans un tableau / graphique basé sur une autre source de données.

fonction Lookup(source_expression, destination_expression, result_expression, dataset)

Exemple :

on récupère dans une 1ère source le pays et le nombre d’habitants (dataset1) et dans une 2ème le pays et le revenu extérieur (dataset2).
Imaginons que nous ayons une matrice avec en ligne la liste des pays. Si on désire par exemple avoir pour chaque pays le rapport revenu par rapport au nombre d’habitant, alors on pourra faire ceci (dans la zone des données de la matrice, on suppose que celle-ci est basée sur le dataset2) :   = Fields!RevExt.value / Lookup(Fields!Country.value, Fields!Country.value, Fields!NbHab.value, »dataset1″)

la fonction lookup va donc regarder le champ Country du dataset en cours, et le comparer au champ Country du dataset défini dans la fonction (3ème paramètre, « dataset1″ dans notre cas), et va récupérer la valeur du champ NbHab dudit dataset.

Si cette fonctionnalité peut paraître simpliste, elle est très utile dans des cas de rapports un peu complexe ou l’on joue sur de nombreuses sources de données.

Dans le cas où l’on trouve plusieurs valeurs pour une même champ de recherche (par exemple, on veut trouver les couleurs disponibles pour une type de produit, on devra utiliser la fonction LookupSet(source_expression, destination_expression, result_expression, dataset) :

=Split(LookupSet(Fields!Product.value, Fields!Product.value, Fields!Color.value, »dataset1″), », »). Le résultat renvoyé étant un objet, on doit utiliser conjointement la fonction Split, qui « explose » le résultat, en le séparant par une valeur (la « , » dans notre cas)

Enfin, si on souhaite renvoyer une somme de valeur au lieu d’une concaténation de chaine, il faudra créer une fonction qui calcule cette somme. Pour cela, faites un clique droit sur le fond du rapport (pas de la page), et aller dans les propriétés. Dans la section Code, rajouter ce code :

Function SumLookup(ByVal items As Object()) As Decimal
 If items Is Nothing Then
 Return Nothing
 End If
 Dim suma As Decimal = New Decimal()
 Dim ct as Integer = New Integer()
 suma = 0
 ct = 0
 For Each item As Object In items
 suma += Convert.ToDecimal(item)
 ct += 1
 Next
 If (ct = 0) Then return 0 else return suma / ct
 End Function

Pour l’utiliser, il suffit d’écrire dans la section expression : =Code.SumLookup(LookupSet(Fields!Product.value, Fields!Product.value, Fields!Amount.value, »dataset1″))

pour chaque produit du dataset A, on aura donc la somme des ventes réalisées dans le dataset B

 - Utilisation d’un champ du rapport pour éviter des calculs inutiles.

Parfois, on nous demande de calculer des sommes, puis des quantités, et un ratio somme sur quantité. Si cette dernière n’est pas calculé dans le dataset, on a parfois tendance à réutiliser le calcul du champ Somme et le diviser par celui du champ Quantité. Le problème est que dans ce cas, les calculs sont répétés plusieurs fois, et si jamais on a besoin de modifier l’un ou l’autre des champs, on doit également modifier le champ Ratio.

Pour éviter cela, et alléger ainsi le rapport, on peut utiliser les expressions de champs : soit le champ Somme (expr : = Fields!Amount.value*Fields!TxChange.value) et le champ Quantite (expr : =Fields!Quantity.value). Pour calculer le ratio, on utilisera cette expression :   =reportitems!Somme.value / reportitems.Quantite.value

Ainsi, si jamais on doit changer la valeur de l’expression Somme ou Quantité, la valeur du champ Ratio sera automatiquement mise à jour. A noter que reportitems! se rapporte au nom du champ donné.

– Formatage de valeur.

Lorsque l’on a besoin de formater des valeurs de manière simple, on peut utiliser les différents expressions :

N0 : numérique sans décimale (suivant les paramètres régionaux de la machine : ex:  5 200)
N2 : numérique avec 2 décimales (suivant les paramètres régionaux de la machine : ex:  5 200,35)
Nx : numérique avec x décimales (suivant les paramètres régionaux de la machine : ex:  5 200,xxxxx)
P0: pourcentage sans décimale (ex : 15 %)
P2: pourcentage avec 2 décimales (ex : 15,52 %)
Px: pourcentage avec x décimales (ex : 15,xxx %)


Génération de fichiers multiples à partir d’un mapping PowerCenter

Objectif : générer, au travers d’un mapping PowerCenter, plusieurs fichiers de sortie qui ont pour nom la valeur contenue dans un fichier en entrée.

Exemple :

image

Construction du mapping : le mapping doit contenir au minimum les objets suivants :

  • Un objet « Source » : permet la définition des données en entrée.
  • Un objet « Expression Definition » : permet la définition de variables nécessaire au split des données en entrée.
  • Un objet « Transaction Control Transformation » : permet la génération des différents fichiers de sortie.
  • Un objet « Target » : permet la définition des fichiers de sortie.

clip_image002[4]

Définition des objets :

  • L’objet « Source » : dans cet exemple, il est supposé que le nom des différents fichiers de sortie est situé en début de ligne (colonne NOM_FIC).

clip_image004[4]

Il est également supposé que cette colonne est séparée du reste de la ligne par un caractère présent une seule fois par enregistrement.

image

  • L’objet « Expression Definition » : Dans l’exemple suivant, l’objet contient :

En entrée :

    • NOM_FIC : contient le nom des fichiers de sortie tel que donné par le fichier source
    • RESTE_LIGNE : contient le reste de l’enregistrement
      En intermédiaire :

    • Curr_Name : permet de stocker le nom de fichier de l’enregistrement précédent.
  • En sortie :

    • NOM_FIC_OUT : contient le nom complet des fichiers de sortie (répertoire + nom du fichier)
    • RESTE_OUT : contient le reste de l’enregistrement avec suppression des espaces en fin d’enregistrement.
    • Prev1_Out : contient le calcul de la variable Curr_Name
    • Prev2_Out : contient le nom du fichier de sortie tel que donné en entrée

clip_image002[6]

  • L’objet « Transaction Control Transformation » :

C’est dans cet objet que se réalise la génération des multiples fichiers de sortie. Dans l’onglet « Properties », il faut renseigner l’attribut « Transaction Control Condition ». Dans le cas où le nom de fichier courant est différent du nom de fichier de l’enregistrement précédent, il faut signifier la rupture avec la commande TC_COMMIT_BEFORE. Dans le cas contraire, il faut utiliser la commande TC_CONTINUE_TRANSACTION pour stocker les enregistrements jsqu’à la prochaine rupture.

N.B. : pour optimiser les performances et minimiser la log, il faut avoir en entrée un fichier trié sur le nom de fichier.

clip_image004[6]

  • L’objet « Target » :

Afin de signifier que le nom des fichiers de sortie est passé en paramètre, il faut cliquer sur le bouton « Add Filename column to the folder ». Il faudra renseigner le nouveau champ « FileName » avec la variable en sortie du « Transaction Control Transformation » qui contient le nom des fichiers.

image

Aucune particularité n’est nécessaire en ce qui concerne la configuration de le Session.

Installation d’Oracle client sur un poste 64 bits et configuration de SSIS

 

1. Introduction

L’objectif de cet article est de vous aidez à configurer votre poste 64 bits pour travailler avec des connexions Oracle client en utilisant SSIS.

2. Installation

Pour commencer nous allons installer la version cliente 32 bits d’oracle. Nous utiliserons comme exemple, la version d’oracle 11.2.0

2.1. Installation Oracle 32 bits.

Choisissez Exécution comme type d’installation, ceci vous permets de notamment de bénéficier d’outil comme sql developper (pour se connecter sur des BDD oracle, faire des requêtes sql etc…)

Après avoir choisi vos langues, choisissez le répertoire où sera installé Oracle. Si vous êtes plusieurs à travailler sur ce poste, je vous conseil de choisir d’installer la version cliente sur un répertoire racine (C : ou D :..)

Pour le reste, faites Suivant jusqu’à la fin de l’installation.

2.2. Installation Oracle 64 bits.

Pour l’installation de la version 64 bits procédez de la même façon que la version 32 bits. Choisissez à nouveau un répertoire à la racine de préférence.

Faites Suivant jusqu’à la fin de l’installation.

3. Configuration des providers Oracle

Vous devez modifier des valeurs de clé de registre, afin de bénéficier des providers Oracle avec SSIS.

3.1. Configuration 32 bits

Connectez vous à la base de registre (tapez la commande regedit dans exécuter). Dans le registre HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSDTC\MTxOCI, modifiez les clés suivantes :

  • OracleOciLib = oci.dll
  • OracleSqlLib = orasql11.dll   (old: SQLLib80.dll) 
  • OracleXaLib = oraclient11.dll  (old: xa80.dll) 

3.2. Configuration 64 bits

Dans le registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI, modifiez les clés suivantes :

  • OracleOciLib = oci.dll
  • OracleSqlLib = orasql11.dll   (old: SQLLib80.dll) 
  • OracleXaLib = oraclient11.dll  (old: xa80.dll) 

Vous devez rebooter la machine.

 

4. Créer votre connexion Oracle dans le TNSNAME

Pour créer votre connexion Oracle vous avez 2 solutions soit vous passez par l’interface d’oracle comme ci-dessous, soit vous allez directement la configurer dans le fichier TNSNAME avec Notepad.

le TNSNAME est dans le répertoire suivant %ORACLE_HOME%/network/ADMIN/ (emplacement du logiciel que vous avez choisi pendant l’installation). Vous devez le configurer dans le répertoire 32 bits et 64 bits

Pour vérifier si votre connexion est valide, ouvrez un éditeur de commande et tapez la commande tnsping
NonDuServiceOracle

Cette commande permet de vérifier que votre service Oracle répond à travers le réseau.

5. Configuration de SSIS

Vous pouvez à présent, utiliser votre connexion cliente Oracle avec SSIS. Dans votre projet SSIS, choisissez une connexion OLEDB de type OLEDB for Oracle Provider. Il y a deux choses importantes à paramétrer. La solution du projet en mode 32 bits et le connecteur OLEDB.

5.1. Forcer la solution du projet SSIS à travailler en 32 bits

Sachez que les providers OLEDB pour Oracle sur les plateformes Microsoft marchent qu’en 32 bits. Dans les propriétés de la solution SSIS changer l’option suivante :

5.2. Modifier la propriété UseDefaultCodePage du connecteur OLEDB

Pour éviter un warning au niveau du connecteur OLEDB modifier la propriété suivante :

 

 

Voilà vous pouvez extraire vos données.

FIN

 

 

Categories: Trucs & astuces Tags:

Gestion des jobs sur sql server agent sans passer par sql server management studio

Lorsque l’on veut démarrer un job sur sql server agent, il n’est pas forcément nécessaire d’utiliser l’interface sql server management studio. Vous pouvez piloter vos jobs, soit en créant une interface maison (une web part par exemple) ou directement par sql. Je vous propose de vous décrire les étapes les plus utilisées.

1. Récupération de liste des jobs et leurs statuts

Pour récupérer la liste des jobs, je vous conseille de faire appel a la procédure stockée suivante msdb.dbo.sp_help_job . Cette procédure ramène les informations complètes sur les jobs y compris le statut en cours.


On va s’intéresser à 2 champs :

  • job_id : identifiant du job nécessaire pour accéder à l’historique des jobs.
  • Current_execution_status : spécifie le statut en cours du job.

    Définition de la liste des statuts :
    0 = arrêté ou suspendu,

    1 = en cours d’exécution,
    2 = en attente d’un thread,
    3 = réessaie,
    4 = arrêté,
    5 = suspendu,
    6 = en attente de terminaison d’étape,
    7 = exécutions des actions d’achèvement

2. Démarrage et arrêt d’un job

2.1 Démarrage du job

Pour démarrer un Job sans passé par l’interface de sql server agent, il suffit de faire appel à la procédure stockée msdb.dbo.sp_start_job .Cette procédure nécessite en paramètre le nom du job à exécuter. Comme dans l’exemple ci-dessous :

Exec msdb.dbo.sp_start_job
‘My_Job_Name’

2.2 Arrêt du job

Pour stopper un Job sans passé par l’interface de sql server agent, il suffit de faire appel à la procédure stockée msdb.dbo.sp_stop_job . Cette procédure nécessite également en paramètre le nom du job à exécuter. Comme dans l’exemple ci-dessous :

Exec msdb.dbo.sp_stop_job
‘My_Job_Name’

3. Connaître le résultat de l’exécution d’un job

Avec la table sysjobhistory il est possible de savoir si l’exécution d’un job c’est terminé avec succès ou non. Après avoir récupérer au préalable l’ID du job, il vous suffit de récupérer la dernière instance, est lire la colonne run_status pour connaître le résultat de l’exécution.

SELECT [instance_id] ,[step_id],[run_status] FROM [msdb].[dbo].[sysjobhistory] where [job_id]= ‘JobID’
and [instance_id] in
(select
Max([instance_id]) FROM [msdb].[dbo].[sysjobhistory] where [job_id] =
‘JobID’)

Categories: Trucs & astuces Tags:

Créer une table de logs pour Analysis Services

L’idée est de montrer comment créer une table SQL qui enregistre les logs d’une instance Analysis Services.

Ces logs permettront par la suite d’extraire des informations tel que :

  • Le nombre d’utilisateurs uniques d’un cube
  • Le nombre de sessions uniques

Ces mesures pourront alors être analysée et suivie par date et par heure.

Configurer l’instance Analysis Services

La configuration par défaut :

  • Au niveau du paramètre Log\QueryLog\QueryLogConnectionString et de la colonne Value, cliquez sur l’icône de sélection :

  • Enfin passez le paramètre Log\QueryLog\CreateQueryLogTable à True :

  • Puis validez en cliquant sur le bouton OK.

La table a alors été créé dans la base de données cible précédemment sélectionnée :

Après quelques requêtes sur le cube, la table se peuple ainsi :

SELECT
TOP 1000 [MSOLAP_Database]


,[MSOLAP_ObjectPath]


,[MSOLAP_User]


,[Dataset]


,[StartTime]


,[Duration]


FROM [Audit].[dbo].[OlapQueryLog]

L’option QueryLogSampling

L’option Log\QueryLog\QueryLogSampling permet de spécifier la fréquence de l’échantillon des requêtes remontées dans la table de logs.

Une valeur à 10, signifie qu’une requête sur 10 serait remontée dans la table de logs.

Si vous souhaitez capturer toutes les logs, il vous faudra donc passer cette valeur à 1 :

Bien entendu, une valeur de 1 peut occasionner de la charge sur votre serveur de base de données.

Requêtes types

Récupération d’information sur l’utilisation du cube ces dernières 24 heures :

– Nb d’utilisateurs uniques

SELECT
COUNT
(DISTINCT [MSOLAP_User] )


FROM [dbo].[OlapQueryLog]


WHERE [StartTime] >=
DATEADD(DAY,
-1, GETDATE())

– Nb de requêtes executées

SELECT
COUNT(*)


FROM [dbo].[OlapQueryLog]


WHERE [StartTime] >=
DATEADD(DAY,
-1, GETDATE())

– Cout des requêtes executées

SELECT
SUM(Duration)


FROM [dbo].[OlapQueryLog]


WHERE [StartTime] >=
DATEADD(DAY,
-1, GETDATE())

– Liste des utilisateurs d’une base de données

SELECT MSOLAP_Database, MSOLAP_User, StartTime, Duration,

CAST(CONVERT(varchar(8), StartTime, 112) AS
int) AS
Day

FROM OlapQueryLog

WHERE (MSOLAP_Database =
‘DataWarehouse’)
and [StartTime] >=
DATEADD(DAY,
-30, GETDATE())

ORDER
BY StartTime DESC

– Liste des utilisateurs par base de données et par jour

SELECT MSOLAP_Database, MSOLAP_User,
SUM(Duration)
AS Duration,

CAST(CONVERT(varchar(8), StartTime, 112) AS
int) AS Day_FK,
COUNT(*)
AS QueryCount

FROM OlapQueryLog

GROUP
BY MSOLAP_Database, MSOLAP_User,
CAST(CONVERT(varchar(8), StartTime, 112) AS
int)

ORDER
BY Day_FK

Exemple de rapports et d’indicateurs

La table de log, vous permettra ainsi d’alimenter certains indicateurs de votre tableau de bord d’exploitation :

De pouvoir suivre l’évolution du nombre d’utilisateurs consommateurs de vos cubes au quotidien :

Et bien entendu d’en avoir la liste :

Nouveautés Power Pivot-Vue diagramme

Le décisionnel Microsoft s’oriente vers le BISM (Business Intelligence Semantic Model) en fusionnant le modèle de PowerPivot et celui, plus classique, d’ Analyses Services (UDM). C’est dans ce contexte que l’on trouve une des grandes nouveautés de powerPivot : la vue diagramme ! bien plus pratique pour réaliser nos modèles d’analyse.

Retour vers la synthèse des nouveautés de Powerpivot V2.

D’autres articles à venir sur les autres nouveautés…