Loupe

Azure SQL Database serverless : conserver son pricing à la recréation de la base de données

Récemment j’ai commencé à utiliser Azure SQL Database serverless pour mes tests d’intégration.

Avant chacun de mes tests d’intégration, je dois supprimer ma base de données puis la recréer, pour que les tests soient indépendants. Or si j’utilise la fonction SQL DROP DATABLE je perds toute ma configuration de performance/pricing Azure. :'(

La solution

Ma solution pour supprimer consiste à :

– supprimer les foreign keys
– puis supprimer les tables une à une

Pour ce, faire je récupère la liste des tables via la table INFORMATION_SCHEMA.TABLES.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void EnsureDeleted()
{
   var tableNames = RawSqlQuery("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES;");
 
   while (tableNames.Count != 0)
   {
      List<string> toRemove = new List<string>();
      // Cette table est ajouté automatiquement par Azure Database et on ne peux pas la supprimer.
 
      tableNames.Remove("database_firewall_rules");
      foreach (var tableName in tableNames)
      {
         // génère un script qui permet de supprimer la FK.
         var scriptsToRemoveFk = RawSqlQuery($@"
                        SELECT
                        'ALTER TABLE ' + OBJECT_SCHEMA_NAME(k.parent_object_id) +
                        '.[' + OBJECT_NAME(k.parent_object_id) +
                        '] DROP CONSTRAINT ' + k.name
                        FROM sys.foreign_keys k
                        WHERE referenced_object_id = object_id('{tableName}')");
 
         foreach (var script in scriptsToRemoveFk)
         {
            _nuContext.Database.ExecuteSqlCommand(script);
         }
 
         #pragma warning disable EF1000 // Possible SQL injection vulnerability.
         _nuContext.Database.ExecuteSqlCommand("DROP TABLE [" + tableName + "]");
         #pragma warning restore EF1000 // Possible SQL injection vulnerability.
         toRemove.Add(tableName);
      }
      foreach (var tableName in toRemove)
      {
         tableNames.Remove(tableName);
      }
   }
}

La méthode permettant de récupérer une liste de string à partir d’une requêtre SQL.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private List<string> RawSqlQuery(string query)
{
    using (var command = _nuContext.Database.GetDbConnection().CreateCommand())
    {
        command.CommandText = query;
        command.CommandType = CommandType.Text;
 
        _nuContext.Database.OpenConnection();
 
        using (var result = command.ExecuteReader())
        {
            var entities = new List<string>();
            while (result.Read())
            {
                entities.Add(result.GetString(0));
            }
 
            return entities;
        }
    }
}

Happy coding !

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus