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