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