|
Add this skill
npx mdskills install sickn33/azure-resource-manager-sql-dotnetComprehensive Azure SQL management with clear examples, hierarchies, and best practices
1---2name: azure-resource-manager-sql-dotnet3description: |4 Azure Resource Manager SDK for Azure SQL in .NET. Use for MANAGEMENT PLANE operations: creating/managing SQL servers, databases, elastic pools, firewall rules, and failover groups via Azure Resource Manager. NOT for data plane operations (executing queries) - use Microsoft.Data.SqlClient for that. Triggers: "SQL server", "create SQL database", "manage SQL resources", "ARM SQL", "SqlServerResource", "provision Azure SQL", "elastic pool", "firewall rule".5package: Azure.ResourceManager.Sql6---78# Azure.ResourceManager.Sql (.NET)910Management plane SDK for provisioning and managing Azure SQL resources via Azure Resource Manager.1112> **⚠️ Management vs Data Plane**13> - **This SDK (Azure.ResourceManager.Sql)**: Create servers, databases, elastic pools, configure firewall rules, manage failover groups14> - **Data Plane SDK (Microsoft.Data.SqlClient)**: Execute queries, stored procedures, manage connections1516## Installation1718```bash19dotnet add package Azure.ResourceManager.Sql20dotnet add package Azure.Identity21```2223**Current Versions**: Stable v1.3.0, Preview v1.4.0-beta.32425## Environment Variables2627```bash28AZURE_SUBSCRIPTION_ID=<your-subscription-id>29# For service principal auth (optional)30AZURE_TENANT_ID=<tenant-id>31AZURE_CLIENT_ID=<client-id>32AZURE_CLIENT_SECRET=<client-secret>33```3435## Authentication3637```csharp38using Azure.Identity;39using Azure.ResourceManager;40using Azure.ResourceManager.Sql;4142// Always use DefaultAzureCredential43var credential = new DefaultAzureCredential();44var armClient = new ArmClient(credential);4546// Get subscription47var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");48var subscription = armClient.GetSubscriptionResource(49 new ResourceIdentifier($"/subscriptions/{subscriptionId}"));50```5152## Resource Hierarchy5354```55ArmClient56└── SubscriptionResource57 └── ResourceGroupResource58 └── SqlServerResource59 ├── SqlDatabaseResource60 ├── ElasticPoolResource61 │ └── ElasticPoolDatabaseResource62 ├── SqlFirewallRuleResource63 ├── FailoverGroupResource64 ├── ServerBlobAuditingPolicyResource65 ├── EncryptionProtectorResource66 └── VirtualNetworkRuleResource67```6869## Core Workflow7071### 1. Create SQL Server7273```csharp74using Azure.ResourceManager.Sql;75using Azure.ResourceManager.Sql.Models;7677// Get resource group78var resourceGroup = await subscription79 .GetResourceGroupAsync("my-resource-group");8081// Define server82var serverData = new SqlServerData(AzureLocation.EastUS)83{84 AdministratorLogin = "sqladmin",85 AdministratorLoginPassword = "YourSecurePassword123!",86 Version = "12.0",87 MinimalTlsVersion = SqlMinimalTlsVersion.Tls1_2,88 PublicNetworkAccess = ServerNetworkAccessFlag.Enabled89};9091// Create server (long-running operation)92var serverCollection = resourceGroup.Value.GetSqlServers();93var operation = await serverCollection.CreateOrUpdateAsync(94 WaitUntil.Completed,95 "my-sql-server",96 serverData);9798SqlServerResource server = operation.Value;99```100101### 2. Create SQL Database102103```csharp104var databaseData = new SqlDatabaseData(AzureLocation.EastUS)105{106 Sku = new SqlSku("S0") { Tier = "Standard" },107 MaxSizeBytes = 2L * 1024 * 1024 * 1024, // 2 GB108 Collation = "SQL_Latin1_General_CP1_CI_AS",109 RequestedBackupStorageRedundancy = SqlBackupStorageRedundancy.Local110};111112var databaseCollection = server.GetSqlDatabases();113var dbOperation = await databaseCollection.CreateOrUpdateAsync(114 WaitUntil.Completed,115 "my-database",116 databaseData);117118SqlDatabaseResource database = dbOperation.Value;119```120121### 3. Create Elastic Pool122123```csharp124var poolData = new ElasticPoolData(AzureLocation.EastUS)125{126 Sku = new SqlSku("StandardPool")127 {128 Tier = "Standard",129 Capacity = 100 // 100 eDTUs130 },131 PerDatabaseSettings = new ElasticPoolPerDatabaseSettings132 {133 MinCapacity = 0,134 MaxCapacity = 100135 }136};137138var poolCollection = server.GetElasticPools();139var poolOperation = await poolCollection.CreateOrUpdateAsync(140 WaitUntil.Completed,141 "my-elastic-pool",142 poolData);143144ElasticPoolResource pool = poolOperation.Value;145```146147### 4. Add Database to Elastic Pool148149```csharp150var databaseData = new SqlDatabaseData(AzureLocation.EastUS)151{152 ElasticPoolId = pool.Id153};154155await databaseCollection.CreateOrUpdateAsync(156 WaitUntil.Completed,157 "pooled-database",158 databaseData);159```160161### 5. Configure Firewall Rules162163```csharp164// Allow Azure services165var azureServicesRule = new SqlFirewallRuleData166{167 StartIPAddress = "0.0.0.0",168 EndIPAddress = "0.0.0.0"169};170171var firewallCollection = server.GetSqlFirewallRules();172await firewallCollection.CreateOrUpdateAsync(173 WaitUntil.Completed,174 "AllowAzureServices",175 azureServicesRule);176177// Allow specific IP range178var clientRule = new SqlFirewallRuleData179{180 StartIPAddress = "203.0.113.0",181 EndIPAddress = "203.0.113.255"182};183184await firewallCollection.CreateOrUpdateAsync(185 WaitUntil.Completed,186 "AllowClientIPs",187 clientRule);188```189190### 6. List Resources191192```csharp193// List all servers in subscription194await foreach (var srv in subscription.GetSqlServersAsync())195{196 Console.WriteLine($"Server: {srv.Data.Name} in {srv.Data.Location}");197}198199// List databases in a server200await foreach (var db in server.GetSqlDatabases())201{202 Console.WriteLine($"Database: {db.Data.Name}, SKU: {db.Data.Sku?.Name}");203}204205// List elastic pools206await foreach (var ep in server.GetElasticPools())207{208 Console.WriteLine($"Pool: {ep.Data.Name}, DTU: {ep.Data.Sku?.Capacity}");209}210```211212### 7. Get Connection String213214```csharp215// Build connection string (server FQDN is predictable)216var serverFqdn = $"{server.Data.Name}.database.windows.net";217var connectionString = $"Server=tcp:{serverFqdn},1433;" +218 $"Initial Catalog={database.Data.Name};" +219 "Persist Security Info=False;" +220 $"User ID={server.Data.AdministratorLogin};" +221 "Password=<your-password>;" +222 "MultipleActiveResultSets=False;" +223 "Encrypt=True;" +224 "TrustServerCertificate=False;" +225 "Connection Timeout=30;";226```227228## Key Types Reference229230| Type | Purpose |231|------|---------|232| `ArmClient` | Entry point for all ARM operations |233| `SqlServerResource` | Represents an Azure SQL server |234| `SqlServerCollection` | Collection for server CRUD |235| `SqlDatabaseResource` | Represents a SQL database |236| `SqlDatabaseCollection` | Collection for database CRUD |237| `ElasticPoolResource` | Represents an elastic pool |238| `ElasticPoolCollection` | Collection for elastic pool CRUD |239| `SqlFirewallRuleResource` | Represents a firewall rule |240| `SqlFirewallRuleCollection` | Collection for firewall rule CRUD |241| `SqlServerData` | Server creation/update payload |242| `SqlDatabaseData` | Database creation/update payload |243| `ElasticPoolData` | Elastic pool creation/update payload |244| `SqlFirewallRuleData` | Firewall rule creation/update payload |245| `SqlSku` | SKU configuration (tier, capacity) |246247## Common SKUs248249### Database SKUs250251| SKU Name | Tier | Description |252|----------|------|-------------|253| `Basic` | Basic | 5 DTUs, 2 GB max |254| `S0`-`S12` | Standard | 10-3000 DTUs |255| `P1`-`P15` | Premium | 125-4000 DTUs |256| `GP_Gen5_2` | GeneralPurpose | vCore-based, 2 vCores |257| `BC_Gen5_2` | BusinessCritical | vCore-based, 2 vCores |258| `HS_Gen5_2` | Hyperscale | vCore-based, 2 vCores |259260### Elastic Pool SKUs261262| SKU Name | Tier | Description |263|----------|------|-------------|264| `BasicPool` | Basic | 50-1600 eDTUs |265| `StandardPool` | Standard | 50-3000 eDTUs |266| `PremiumPool` | Premium | 125-4000 eDTUs |267| `GP_Gen5_2` | GeneralPurpose | vCore-based |268| `BC_Gen5_2` | BusinessCritical | vCore-based |269270## Best Practices2712721. **Use `WaitUntil.Completed`** for operations that must finish before proceeding2732. **Use `WaitUntil.Started`** when you want to poll manually or run operations in parallel2743. **Always use `DefaultAzureCredential`** — never hardcode passwords in production2754. **Handle `RequestFailedException`** for ARM API errors2765. **Use `CreateOrUpdateAsync`** for idempotent operations2776. **Navigate hierarchy** via `Get*` methods (e.g., `server.GetSqlDatabases()`)2787. **Use elastic pools** for cost optimization when managing multiple databases2798. **Configure firewall rules** before attempting connections280281## Error Handling282283```csharp284using Azure;285286try287{288 var operation = await serverCollection.CreateOrUpdateAsync(289 WaitUntil.Completed, serverName, serverData);290}291catch (RequestFailedException ex) when (ex.Status == 409)292{293 Console.WriteLine("Server already exists");294}295catch (RequestFailedException ex) when (ex.Status == 400)296{297 Console.WriteLine($"Invalid request: {ex.Message}");298}299catch (RequestFailedException ex)300{301 Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");302}303```304305## Reference Files306307| File | When to Read |308|------|--------------|309| [references/server-management.md](references/server-management.md) | Server CRUD, admin credentials, Azure AD auth, networking |310| [references/database-operations.md](references/database-operations.md) | Database CRUD, scaling, backup, restore, copy |311| [references/elastic-pools.md](references/elastic-pools.md) | Pool management, adding/removing databases, scaling |312313## Related SDKs314315| SDK | Purpose | Install |316|-----|---------|---------|317| `Microsoft.Data.SqlClient` | Data plane (execute queries, stored procedures) | `dotnet add package Microsoft.Data.SqlClient` |318| `Azure.ResourceManager.Sql` | Management plane (this SDK) | `dotnet add package Azure.ResourceManager.Sql` |319| `Microsoft.EntityFrameworkCore.SqlServer` | ORM for SQL Server | `dotnet add package Microsoft.EntityFrameworkCore.SqlServer` |320
Full transparency — inspect the skill content before installing.