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 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.
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. **
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 !