19 Avr 2016

Migration d’une application Web de SQL Server 2014 à SQL Azure

Aujourd’hui, j’ai travaillé sur la migration d’une application Web dans Azure.

Il s’agit d’une application web utilisant une base de données SQL Server 2014 via Entity Framework 6.

Certaines tables de la base de données utilisaient pour clés primaires des colonnes Identity(1,1).
Avec SQL Azure, cela est supporté mais le comportement peut surprendre :

http://stackoverflow.com/questions/20442543/sql-server-strange-identity-increment

https://social.msdn.microsoft.com/Forums/vstudio/en-US/61f3875f-9b10-4e2c-8501-e325fa17e5a7/azure-database-identity-field-jump?forum=ssdsgetstarted

Ce comportement est by design sur SQL Azure.
Au niveau code de l’application, ces colonnes étaient mappées sur le type int.
Il se peut donc qu’un jour l’id d’une entité dépasse int.Max et que l’application tourne moins bien.
Cette valeur max pourrait être atteinte d’autant plus vite si l’auto incrément fait des gaps importants entre deux générations.

Il est tout de même possible d’avoir un auto incrément : SQL Server propose depuis la version 2012 la notion de séquence telle qu’on la retrouve sous Oracle.
Cela vous garantit que les valeurs générées ne présenteront pas de gap entre deux générations.
C’est aussi simple à mettre en place que sur Oracle, au niveau Entity Framework l’appel aux séquences se fait de la même manière et c’est supporté par SQL Azure.

A noter que pour créer une séquence, il faut utiliser des valeurs constantes dans l’ordre CREATE SEQUENCE.
Il n’est donc pas possible de faire « CREATE SEQUENCE MA_SEQUENCE START WITH SELECT MAX(ID) + 1 FROM MATABLE … ».

Pour une migration cela peut s’avérer embêtant car d’environnement en environnement les séquences ne devront pas démarrer à partir du même point.
Pour gérer cette limitation, j’ai utilisé la commande EXEC(sql) afin de construire mes séquences de manière dynamique :

Si cela peut vous être utile, c’est cool !

Share