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