Déploiement SSAS

SSAS déploiement – L’erreur système suivante s’est produite :

La semaine dernière, j’ai tenté de déployer un cube SSAS mais je me suis heurté à une erreur qui n’est pas forcément très explicite :

L'erreur système suivante s'est produite :
 SSAS Erreur déploiement

Et bien évidemment, aucune information supplémentaire ! C’est Jean-Pierre Riehl qui m’a donné la solution. Dans mon projet SSAS, j’ai un rôle qui s’appelle « Lecteur ».

SSAS Role

Parmi les membres de ce rôle, j’ai un login qui n’existe plus dans mon Active Directory. Si je le supprime, le déploiement fonctionne bien !

SSAS Role login inexistant

Sans l’aide de Jean-Pierre, j’aurais pu encore chercher longtemps. J’espère que dans les prochaines versions de SQL Server, les développeurs ajouteront l’erreur suivante :

L’erreur système suivante s’est produite : Un membre de votre rôle n’a pas été trouvé.

Bien évidemment, certains pourront me reprocher de ne pas avoir utilisé de groupe d’utilisateurs plutôt qu’un utilisateur directement et ils auront bien raison ! 🙂

Débuter avec SMO et C# : performances SetDefaultInitFields

Bonjour,

Dans l’article précédent, je vous ai montré comment ouvrir une connexion à une instance SQL Server avec SMO et C# puis à lister le nom des bases de données. Avant d’aller plus loin dans l’apprentissage de SMO, il y a une notion très importante à retenir pour avoir de bonnes performances : SetDefaultInitFields.

Si je lance une trace SQL lors de l’exécution du programme qui liste le nom des bases de données, je vais voir que 5 requêtes ont été exécutées. Les 4 premières sont propre à l’utilisation de SMO, il a besoin d’obtenir des informations sur l’instance et la base avant de générer sa requête. Celle qui nous intéresse est la dernière qui sert à lister le nom des bases de données :


SELECT
dtb.name AS [Name]
FROM
master.sys.databases AS dtb
ORDER BY
[Name] ASC

SQL Profiler et SMO

Jusqu’ici, la requête générée est plutôt propre.

Lister la collation de chaque base de données

Je vais un peu modifier le code afin d’ajouter la collation de chaque base de données


string _instanceName = "localhost";
smoCommon.ServerConnection sc = new smoCommon.ServerConnection(_instanceName);
sc.Connect();
smo.Server monServeur = new smo.Server(sc);
foreach (smo.Database maBase in monServeur.Databases)
{
    Console.WriteLine(maBase.Name + " : " + maBase.Collation);
}
sc.Disconnect();

SMO Affichage des bases et des collations

Analyse de la trace SQL Profiler

Voici le résultat de la trace SQL Profiler. Comme vous pouvez le constater, nous sommes loin d’un traitement ensembliste et efficace ! Il y a une seule requête pour récupérer le nom de toutes les bases de données mais ensuite une requête par base de données pour récupérer la collation !

SQL Profiler SMO sans SetDefaultInitFields

Comment rendre le traitement ensembliste ?

Il existe une méthode pour améliorer la génération de l’écriture de la requête. Il s’agit de SetDefaultInitFields. Cette méthode permet de préciser à SMO qu’il doit récupérer certaines ou toutes les propriétés en une seule étape.

Je vais maintenant modifier mon code afin d’utiliser cette méthode pour récupérer également la collation :


string _instanceName = "localhost";
smoCommon.ServerConnection sc = new smoCommon.ServerConnection(_instanceName);
sc.Connect();
smo.Server monServeur = new smo.Server(sc);
monServeur.SetDefaultInitFields(typeof(smo.Database), "Collation");
foreach (smo.Database maBase in monServeur.Databases)
{
 Console.WriteLine(maBase.Name + " : " + maBase.Collation);
}
sc.Disconnect();

Et voici donc le résultat de la trace SQL Profiler.
SQL Profiler SMO avec SetDefaultInitFields

Il n’y a plus qu’une seule requête pour récupérer le nom et la collation :


SELECT
dtb.name AS [Name],
dtb.collation_name AS [Collation],
dtb.name AS [DatabaseName2]
FROM
master.sys.databases AS dtb
ORDER BY
[Name] ASC

Conclusions

Je vous ai montré cette méthode pour les bases de données, mais elle est également valable pour tous les autres objets SMO (les tables, les procédures stockées, les vues, etc…). Imaginez les gains de performance sur une base de données à plusieurs milliers de procédures stockées !

Attention tout de même : si vous écrivez mal la ou les propriétés dans la méthode SetDefaultInitFields, vous n’aurez pas d’erreur à la compilation puisque c’est une stringCollection. L’erreur surviendrait à l’exécution.

Débuter avec SMO et C# pour piloter SQL Server

SMO est un ensemble de bibliothèques fournies par Microsoft pour automatiser le pilotage des bases de données SQL Server. Je m’en sers beaucoup dans le développement de Kankuru ou dans mon quotidien de DBA. Dans Kankuru par exemple, je les utilise pour afficher la liste des bases de données d’une instance ou la liste des tables d’une base de données.

Je trouve ces librairies très pratique bien que parfois plus lent que du code T-SQL. En effet, l’utilisation de SMO revient souvent à faire du traitement unitaire plutôt que du traitement ensembliste. Je reviendrai dans un futur article sur ces problèmes de performance.

Dans cet article, je vais vous montrer un exemple de base pour apprendre à vous connecter à une instance.

Prérequis

Bien que l’on puisse utiliser ces bibliothèques avec Powershell, pour ma part je préfère le C#. Je vais donc utiliser Visual Studio 2012 Express Edition for Windows Desktop.

Vous trouverez les dll SMO dans le répertoire d’installation de SQL Server (sur mon PC : C:Program FilesMicrosoft SQL Server110SDKAssemblies).

Préparation du projet

Dans Visual Studio, je vais créer une application console. Mais bien évidemment, vous pouvez l’utiliser dans une application WPF, Windows Forms ou ASP.Net.

Création du projet d'application console

Une fois le projet créé, il faut importer les DLL requises. A minima, vous aurez besoin de :

  • Microsoft.SqlServer.Smo.dll
  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer.Management.Sdk.Sfc.dll

Ajouter les références

Connexion à une instance avec SMO

Il faut tout d’abord commencer par importer les bibliothèques :

using smoCommon = Microsoft.SqlServer.Management.Common;
using smo = Microsoft.SqlServer.Management.Smo;

Ensuite, on peut se connecter à l’instance. Ci-dessous, un simple test de connexion puis déconnexion.

NB : Cet exemple utilise l’authentification Windows. Votre utilisateur Windows doit avoir des droits sur l’instance.

Si vous n’arrivez pas à exécuter ceci, pas la peine d’aller plus loin ! Vérifier le nom de votre instance (serveurinstance)

string _instanceName = "localhost";
smoCommon.ServerConnection sc = new smoCommon.ServerConnection(_instanceName);
sc.Connect();
sc.Disconnect();

Afficher le nom des bases de données

Une fois connecté à l’instance, on peut facilement récupérer la liste de toutes les bases de données:


string _instanceName = "localhost";
smoCommon.ServerConnection sc = new smoCommon.ServerConnection(_instanceName);
sc.Connect();
smo.Server monServeur = new smo.Server(sc);
foreach (smo.Database maBase in monServeur.Databases)
{
 Console.WriteLine(maBase.Name);
}
sc.Disconnect();

Afficher la liste des bases de données avec SMO

Dans un prochain article, je rentrerai plus dans le détail de l’utilisation de SMO. Je vous montrerai comment scripter des objets par exemple.

Afterwork du Guss

Afterwork du GUSS

Tous les deux mois, le GUSS organise un afterwork à Paris. Vous êtes DBA, développeur SQL, vous faites de la BI ou juste intéressés par SQL Server alors vous êtes les bienvenues.

C’est un bon moyen pour rencontrer des personnes qui font le même métier que vous et d’échanger sur vos problématiques techniques autour d’un verre.

En principe, nous définissons un thème technique lors de ces afterworks mais cette fois-ci, puisque c’est le premier afterwork depuis l’élection du board, vous pourrez nous soumettre vos questions et vos idées.

Pour venir, c’est très simple. Il suffit de vous inscrire à l’évènement sur le site du GUSS puis de vous rendre le 2 avril 2014 à 19h à cette adresse :

Charly-Birdy
1 place Etienne Pernet, Paris 15ème
Métro Commerce

Venez nombreux !

Self Service BI par Azeo

Self-Service BI par AZEO

Ce matin, je me suis rendu au centre de conférence de Microsoft pour assister à la matinée de formation proposée par Azeo : La Self-Service BI.

Self Service BI par Azeo

Depuis quelques mois, je travaille sur un projet de BI pour mon entreprise. Je connaissais déjà bien SSRS (en mode SQL) et SSIS, mais je suis encore novice en SSAS (Tabulaire ou Multi-dimensionnelle) et tous les outils de restitution, partage, etc… me sont inconnus.

J’attendais donc de cette démo d’avoir un aperçu exhaustif des différents outils que mes collègues pourront utiliser sans forcément rentrer dans la technique.

A mon arrivée au centre de conférence de Microsoft, j’ai été accueilli chaleureusement par l’équipe Azeo et un petit déjeuner.

La session était présenté par Jean Pierre Riehl.Je n’ai pas de photo malheureusement mais rassurez vous, il portait bien une cravate 🙂

En introduction, il nous a rappelé une définition de la BI pour que tout le monde dans la salle comprenne bien ce dont on allait parler. Ce que j’en retiens c’est que le projet BI n’est pas une fin en soit mais juste un outil pour que les personnes du métier prennent les bonnes décisions pour améliorer les résultats de l’entreprise.

Après cette rapide introduction, ce fut au tour de Franck Mercier de nous donner la vision de Microsoft sur la Self-Service BI. Il nous a raconté l’histoire de John Snow (non, pas celui de Game of Thrones hein !) qui, lors de l’épidémie de choléra à Londres en 1854, a utilisé sans le savoir un des premiers outils décisionnel. C’était une approche sympa, ça change des exemples traditionnels.

Pour résumer, la Self-Service BI doit offrir un accès simple à toutes les données, à tout le monde grâce à un seul outil : Excel.

Jean-Pierre a ensuite repris la main pour nous faire quelques démos.

Démo 1
Depuis Excel, accès aux données publiques de la banque de france via Internet Explorer puis injection dans Excel avec Power Query.

Démo 2
Élections municipales de Paris en 2008 avec Power Query et Power Pivot.
Pour en mettre plein la vue aux personnes dans la salle, Jean Pierre a meme montré une vidéo en « story telling » de Power Map. C’est l’effet « wahou » garanti !

Démo 3
Power View + Power Pivot pour présenter la fréquentation musées en Ile-de-France. J’utilise Power View sur un cube tabulaire depuis quelques mois donc je n’ai pas été surpris par l’outil, mais c’est tout de même sympa.

Démo 4
Partage des fichiers Excel sur un site collaboratif SharePoint suivi par une rapide présentation de Q&A (show me medals) count by discipline

A la suite de ces démos, Azeo nous a présenté son offre commerciale. Comme je ne suis pas facilement achetable (enfin, ça dépend hein !) je n’en parlerai pas ici mais vous pouvez les contacter.

Conclusion

Je voulais voir à quoi ressemblait les outils Power BI sans rentrer dans la technique et cette session m’a permis d’en voir un bon aperçu. Maintenant, il faut voir comment l’intégrer dans mon entreprise.

Database Compare avec Kankuru

Qui n’a jamais été confronté à des bases de données SQL de différents environnements qui n’ont pas la même structure ?

Je travaille actuellement sur un projet de BI dans mon entreprise. Je ne suis pas seul dans l’équipe qui est composée de plusieurs développeurs. Chacun est sysadmin de l’instance de développement donc tout le monde modifie la structure des bases. Dans le DataWareHouse, certains créent des tables, d’autres modifient des vues, des indexs, des jobs, etc…

Le jour de la livraison, je découvre souvent que certaines modifications n’ont pas été scriptées et c’est à ce moment que les problèmes commencent… Sans outil adapté pour déterminer les différences entre l’environnement de développement et celui de production, je perds beaucoup de temps à déployer la nouvelle release.

Simple à réaliser ?

J’ai donc décidé d’ajouter un outil qui me convient à l’application Kankuru. A première vue, le challenge est assez simple, il suffit pour chaque objet de la base de données source de le scripter et de le comparer au script de l’objet correspondant dans la base de données cible. Oui mais :

    • Comment afficher le résultat pour que ce soit exploitable ? En effet, si je compare des centaines ou des milliers d’objets, il me faut une interface simple et efficace.
    • L’outil doit être rapide : sur une base avec des centaines d’objets, je ne peux pas attendre quelques heures pour obtenir un résultat !
    • Détecter les différences c’est bien, mais je veux voir les différences réels. Trouver un composant de différence de script s’est avéré plus compliqué que prévu.
    • L’utilisateur doit avoir un minimum de paramètres de configuration. Certains veulent certains objets, d’autres veulent faire des comparaison « Case Sensitive » ou sans les commentaires
    • Si je peux comparer les DDL des tables ou des procédures stockées, pourquoi ne pas proposer aussi de comparer également la sécurité, les jobs de l’agent, la configuration de l’instance..
    • .Et les données dans tout ça ? Si 2 tables de dimension sont identiques mais que les données ne le sont pas, ma mise en production va surement échouer, non ?

Bref, je me suis heurté à beaucoup de difficultés sur cet outil. Ce fut long mais je suis maintenant satisfait !

Ca ressemble à quoi ? Comment on s’en sert ?

L’outil est entièrement intégré à Kankuru, En ouvrant Database Compare, on retrouve donc toutes nos instances et les bases de données. Il suffit de sélectionner 2 bases et de cliquer sur le bouton « Compare » et c’est parti ! Pour l’affichage des résultats, j’ai trouvé un composant qui permet de mixer un Treeview et un GridView :

Database Compare TreeListView

Comment les objets sont scriptés ?

L’application utilise les bibliothèques SMO de Microsoft (SQL Server Management Objects) pour scripter les objets. C’est grâce à ce choix de technologie que l’outil est fiable et rapide. Bien évidemment, une fois que je récupère le script des objets il reste à trouver les éventuelles différences. Ca m’a permis de réviser mes connaissances sur les classes String, StringBuilder, etc…

Quel est le composant graphique utilisé pour surligner les différences ?

Après avoir passé de nombreuses heures de recherches et de tests de quelques composants existant, j’ai du me faire une raison : « Greg, tu vas devoir te débrouiller tout seul et mettre le nez dans les algorithmes ! »

Si dans un bloc de 10 lignes de textes j’ai un mot de différence, la ligne en question est très simple à surligner. Mais comment faire si une ligne est insérée en plein milieu ? Le décalage ne permet plus de comparer le script ligne à ligne. Je n’avais déjà pas beaucoup de cheveux sur la tête mais j’en ai quand même trouvé quelques uns pour me les arracher !

Database Compare différence des scripts

Et si je veux comparer les objets en supprimant les commentaires ?

Ou en ignorant la collation, la casse ou encore les espaces ? C’est facile, il suffit de cocher/décocher des cases !

Beaucoup d’objets à comparer

La plupart des objets SQL Server sont comparables. Je pense que vous devriez trouver votre bonheur dans la liste que je propose. L’outil permet de comparer :

  • La configuration globale de l’instance/base
  • La structure des objets
  • La sécurité
  • Les objets du SQL Agent (job, planification, opérateur, …)

Database Compare Objets à comparer

Et les données ?

Kankuru peut comparer les données de 2 tables. Mais contrairement à bon nombre d’outils, Kankuru est rapide et peu couteux en terme de ressources grâce à la magie des checksum.

Envie de le tester ?

Pour le moment, l’application est seulement en test pour quelques utilisateurs, mais elle ne devrait plus trop tarder à arriver…

Database Compare Overview

Ouverture du blog

Bonjour à tous !

Ceux qui me connaissent déjà savent que depuis plus de 2 ans je publie mes articles sur le blog Kankuru. Quoi ? Vous ne connaissez pas encore cette application que je développe et qui permet de connaitre tout ce qui se passe sur vos bases de données SQL Server ? Téléchargez la sans tarder, c’est gratuit, non intrusif et facile à utiliser. En plus, le développeur est très sympa !

Il y a beaucoup de choses à dire sur SQL Server, le développement, les performances. Dans la vrai vie, je ne suis pas que le développeur de Kankuru mais je suis DBA SQL Server (oui j’ai un vrai métier à coté !) Comme je préfère dédier le blog Kankuru aux news de l’application, aux nouveautés, aux réponses à vos questions, j’ai décidé d’en ouvrir un nouveau plus personnel et moins centré sur l’application.

Dans ce nouveau blog, je vais donc vous tenir informé sur toute l’actualité SQL Server comme par exemple la sortie de SQL Server 2014 le 1er avril, vous parler des différents outils de l’éco-système SQL Server (SSIS, SSRS, SSAS, Management Studio, etc…), de mes déboires de DBA, de mes problématiques de développement (C#, WPF, ASP.net) et de tout ce que je rencontre au quotidien. Je vous ferai donc partager toute mon expérience avec des articles, des tutoriels, des tests, etc…

Bien évidemment, je relayerai également certaines news importantes du GUSS (Groupe des Utilisateurs de SQL Server) dont je fais parti depuis février 2014. Si vous ne connaissez pas le GUSS, c’est l’association qui organise :

  • les journées SQL Server chaque année chez Microsoft
  • les SQL Saturday
  • les Webcasts mensuels (sessions techniques en direct de 30 minutes. Une bonne occasion de se former gratuitement !)
  • les afterworks tous les 2 mois car c’est important aussi de savoir se détendre 🙂 Le prochain aura lieu le 2 avril au Charly-Birdy. Ce sera un bon moyen de faire connaissance et de discuter technique.

A très bientôt pour de nouveaux articles.