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

> Récemment j’ai commencé à utiliser Azure SQL Database serverless pour mes tests d’intégration. Or avant chacun de mes tests d’intégration je dois supprimer ma base…

- Auteur: Jérôme Giacomini
- Langue: fr
- URL canonique: [Azure SQL Database serverless : conserver son pricing à la récréation de la base de données](https://jeromegiacomini.net/fr/articles/2020/02/10/azure-sql-database-serverless-recreer-db)
- Publié le: 2020-02-10
- Dernière modification: 2026-09-05
- Thèmes: .NET, C#, Azure, SQL

Récemment j’ai commencé à utiliser [Azure SQL Database serverless](https://jeromegiacomini.net/Blog/2020/01/20/azure-sql-database-serverless/) pour mes tests d’intégration.
Or avant chacun de mes tests d’intégration je dois supprimer ma base de données puis la recréer, pour que ceux-ci soient indépendant.

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 de supprimer les tables une à une

Pour se faire je  récupère la liste des tables via la table INFORMATION\_SCHEMA.TABLES.

```csharp

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&#8217;une requêtre SQL. **

```csharp

        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 !
