Recently I started using Azure SQL Database without server For my integration tests. But before each of my integration tests I have to delete my database and then recreate it so that it is independent.
But if I use the SQL DROP DATABLE function I lose all my Azure performance/pricing configuration.
The Solution
My solution to deleting is:
Delete foreign keys then delete the tables one by one
To do so I retrieve the list of tables through the INFORMATION table_here
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);
}
}
}
The method of retrieving a string list from’a SQL query.
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 !