Monday, August 31, 2009

Comme le fichier ne passait pas dans ce blog, voici la liste des retouches que j’ai faites sur le script de création de Northwind pour qu’il passe dans SQL Azure. Il y a encore un peu de magie noire pour moi dans tout ça mais j’ai un peu appris des messages d’erreur.

 

Les points de départ :

1/ Le script instnwnd.sql que j’ai trouvé sur http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en.

2/ L’instance de base de données dans SQL Azure : cf. post précédent, je détruis et recrée la base en passant par http://sql.azure.com à chaque manipulation. Je suis certain que ce n’est pas malin mais je chercherai plus élégant un autre jour.

 

La liste des manips à faire :

  • Dégager le script de création de la base. Sql Azure ne sait pas sauter de base en base dans un même script, donc…
  • Dégager les scripts qui testent et détruisent les objets avant de les recréer. On pourrait sans difficulté les migrer, mais ils requêtent sur sysobjects (qui est obsolète depuis SQL Server 2005, et ne passe pas sous SQL Azure). Pour les migrer il faut partir en requêtage de sys.objects, mais j’ai eu la flemme de le faire jusqu’au bout, d’autant que je détruis ma base à chaque itération…
  • Se débarrasser des types obsolètes.
    J’ai fait les remplacements suivants, je ne sais pas s’il y en a d’autres (même si mes moteurs de recherche préférés laissent augurer que non) :
  • Dans Sql 2000 Dans Sql Azure
    image varbinary(max)
    ntext nvarchar(max)
    text varchar(max)

    (ps : je n’ai pas croisé text dans Northwind)
  • Dégager toutes les références à des filegroup. Dans mon cas, les Create Table …. ON [PRIMARY] (si vous êtes encore moins bons que moi en base de données, supprimez bêtement ON [PRIMARY]). Encore une fois, vous n’avez pas la maitrise de la topologie sous-jacente à votre base.
  • Retouchez les index : celui-là m’a laissé perplexe un moment, mon script échouait sur l’insertion de données dans la table Region (notamment) avec un message un peu elliptique :
  • Msg 40054, Level 16, State 1, Line 9
    Heaps can not be replicated tables. Please create a clustered index for the table.

    Je pense que les aficionados savent ce que ça veut dire avec plus de précisions, j’y vois juste un indice important : les mécanismes de réplication de Sql Server sont probablement utilisés par Sql Azure pour sa propre redondance de vos instances. Ceci expliquerait une bonne part des différences entre Sql Server 2008 et Sql Azure. Bref, pour corriger ce pépin il faut d’une part retoucher la définition de la clé primaire en virant la clause NONCLUSTERED (et oui, ça peut avoir quelques conséquences sur l’exécution de vos requêtes) et d’autre part intervertir dans le script Northwind les sections de définition des contraintes et d’insertion des données (le script insère les données puis pose les contraintes, ici on est obligé de définir les clés primaires avant d’insérer les données).

     

Le reste est tombé en marche (vues etprocédures stockées), et les manips se passent bien pour le moment. Prochaines étapes : câbler tout ça sur ADO.Net Data Services pour jouer un peu avec des clients ne disposant pas de drivers pour Sql Server/Sql Azure

Monday, August 31, 2009 5:00:07 PM (GMT Standard Time, UTC+00:00) |  | #

Dans le post précédent j’ai parlé de SSMS (Sql Server Management Studio) pour manipuler votre instance de SQL Azure, mais le support est plutôt limité pour le moment, il manque surtout l’explorateur d’objets qui rend quelques services quand on fait ses mises au point…

 

Jusqu’à 20 minutes auparavant j’avais une approche un peu simpliste mais qui fonctionne :

  1. Travailler sur une base SQL Express locale
  2. Une fois le résultat voulu obtenu, exporter les scripts de création et de population de la base
  3. Détruire et recréer la base SQL Azure de travail (je sais, c’est moche)
  4. Refermer et rouvrir SSMS, refuser la connexion par défaut, créer une nouvelle requête en se positionnant sur la bonne base
  5. Copier/Coller le script de travail dans la fenêtre de requête  (un drag and drop dans SSMS crée nouvelle fenêtre de requête, qui pointe par défaut sur Master, et comme le changement de base n’est pas supporté dans SQL Azure, on se retrouve en train de jouer son script sur Master…)
  6. Comprendre les messages d’erreurs, retoucher le script, reprendre à l’étape 3

SqlAzureManager

En corrigeant un problème tordu je suis tombé par hasard sur ce petit bijou : http://hanssens.org/post/SQL-Azure-Manager.aspx

C’est encore un peu rugueux mais on retrouve un confort de manipulation agréable.

Monday, August 31, 2009 4:18:19 PM (GMT Standard Time, UTC+00:00) |  | #
Monday, August 24, 2009

J’ai récupéré la semaine dernière un token de test pour SQL Azure (lien d’inscription à la CTP de SQL Azure), et comme j’étais en train de regarder le driver SQL Server pour PHP, j’ai fait un petit test pour combiner les deux.

 

  • Création de Northwind dans SQL Azure.

J’ai un peu retouché le script de création de Northwind (j’ai repris celui fourni pour SQL 2000 !) pour prendre en compte quelques différences entre SQL Azure et SQL 2000 (disparition de certains types obsolètes genre Image et Text, et moins d’instructions DDL)  et créé la base de données directement depuis le portail (http://sql.azure.com). Pour l’exécution du script j’ai pris SQL Server Management Studio. Dans la version actuelle de SQL Azure on ne peut pas se connecter directement avec l’explorateur d’objets, mais en exécutant une nouvelle requête on peut fournir les infos de connexion et exécuter des scripts sans difficulté :

image

Le script de création retouché :

 

  • Installation de PHP et du driver pour SQL Server

J’ai un peu joué avec vingt façons de faire donc je ne vous donnerai pas de recette miracle, mais le Web Platform Installer devrait fonctionner pour l’installation de PHP. J’ai installé une 5.3 et une 5.2.10 (toutes les deux en version non threadsafe, puisque ça se marie bien avec FastCGI). Pour le driver PHP SQL Server vous le trouverez sur CodePlex, les instructions d’installation sont claires.

 

  • Utilisation du driver pour attaquer une base SQL Express 2008

Je suis certain que le code est bourré de maladresses, mais c’est un premier essai. A noter que j’ai pris une authentification par login/password, de façon à pouvoir porter le code directement pour SQL Azure (qui ne supporte pas encore d’authentification fédérée) :

 

<h1>Test de connexion sql server</h1>
<?php
// Infos de connexion
  $server = "localhost\sqlExpress";
  $user = "monuser";
  $pass = "monMotDePasse";
  $database = "Northwind";

// connexion a la base
  $connectionoptions = array(
  "Database" => $database, 
  "UID" => $user, 
  "PWD" => $pass,
  "MultipleActiveResultSets" => "0");
  $conn = sqlsrv_connect($server, $connectionoptions)
    or die ( print_r( sqlsrv_errors() ));

// Creation et execution de la requete
  $tsql = "SELECT * from Employees";    
  $stmt = sqlsrv_query( $conn, $tsql);
  if( $stmt === false )
  {
       echo "Impossible d'executer la requete.</br>";
       die( print_r( sqlsrv_errors()));
  }

// Affichage des resultats
  while( $row = sqlsrv_fetch_array($stmt))
  {
    echo "Nom : ".$row["FirstName"].", ";
    echo "Prenom : ".$row["LastName"]."<br/>";
  }


// Un peu de menage
  sqlsrv_free_stmt( $stmt);
  sqlsrv_close( $conn);
?>

image

 

A noter : j’ai désactivé MultipleActiveResultSet qui ne fouctionne pas sur Sql Azure avec les versions que j’ai, mais je n’ai pas creusé plus les raisons. Le résultat de cette page n’est pas superimpressionnant, mais ça fonctionne pas mal:

 

  • Utilisation du driver pour attaquer SQL Azure

Modulo les petites précautions prises plus haut (retouche du script, passage de login/password, et désactivation de MARS), il n’y a pas de modifications à apporter au script, j’ai juste retouché 3 lignes :

<h1>Test de connexion sql azure</h1>
<?php
// Infos de connexion
  $server = "monserveur.ctp.database.windows.net";
$user = "monuser@monserveur"; $pass = "monMotDePasse"; $database = "Northwind"; …

 

image

Le résultat, sans grande surprise :

 

Un dernier détail : puisque nous ne sommes plus dans un périmètre sûr, il est malsain de passer un username/password en clair. Modifiez votre chaine de connexion pour demander un chiffrement quand vous travaillez sur SQL Azure :

// connexion a la base
  $connectionoptions = array(
  "Database" => $database, 
  "UID" => $user, 
  "PWD" => $pass,
  "MultipleActiveResultSets" => "0",
  "Encrypt" => "1");
  $conn = sqlsrv_connect($server, $connectionoptions)
    or die ( print_r( sqlsrv_errors() ));
Monday, August 24, 2009 10:49:54 AM (GMT Standard Time, UTC+00:00) |  | #
Search
Archive
Links
Categories
Admin Login
Sign In
Blogroll
Themes
Pick a theme: