azure-resource-manager-sql-dotnet

Verwaltungsebene SDK zur Bereitstellung und Verwaltung von Azure SQL-Ressourcen über Azure Resource Manager.

npx skills add https://github.com/microsoft/skills --skill azure-resource-manager-sql-dotnet

Azure.ResourceManager.Sql (.NET)

Management plane SDK for provisioning and managing Azure SQL resources via Azure Resource Manager.

⚠️ Management vs Data Plane

  • This SDK (Azure.ResourceManager.Sql): Create servers, databases, elastic pools, configure firewall rules, manage failover groups
  • Data Plane SDK (Microsoft.Data.SqlClient): Execute queries, stored procedures, manage connections

Installation

dotnet add package Azure.ResourceManager.Sql
dotnet add package Azure.Identity

Current Versions: Stable v1.3.0, Preview v1.4.0-beta.3

Environment Variables

AZURE_SUBSCRIPTION_ID=<your-subscription-id>  # Required: Azure subscription ID
AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production
AZURE_TENANT_ID=<tenant-id>  # For service principal auth (optional)
AZURE_CLIENT_ID=<client-id>  # For service principal auth (optional)
AZURE_CLIENT_SECRET=<client-secret>  # For service principal auth (optional)

Authentication

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Sql;

// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
var credential = new DefaultAzureCredential(
    DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
var armClient = new ArmClient(credential);

// Get subscription
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
    new ResourceIdentifier($"/subscriptions/{subscriptionId}"));

Resource Hierarchy

ArmClient
└── SubscriptionResource
    └── ResourceGroupResource
        └── SqlServerResource
            ├── SqlDatabaseResource
            ├── ElasticPoolResource
            │   └── ElasticPoolDatabaseResource
            ├── SqlFirewallRuleResource
            ├── FailoverGroupResource
            ├── ServerBlobAuditingPolicyResource
            ├── EncryptionProtectorResource
            └── VirtualNetworkRuleResource

Core Workflow

1. Create SQL Server

using Azure.ResourceManager.Sql;
using Azure.ResourceManager.Sql.Models;

// Get resource group
var resourceGroup = await subscription
    .GetResourceGroupAsync("my-resource-group");

// Define server
var serverData = new SqlServerData(AzureLocation.EastUS)
{
    AdministratorLogin = "sqladmin",
    AdministratorLoginPassword = "YourSecurePassword123!",
    Version = "12.0",
    MinimalTlsVersion = SqlMinimalTlsVersion.Tls1_2,
    PublicNetworkAccess = ServerNetworkAccessFlag.Enabled
};

// Create server (long-running operation)
var serverCollection = resourceGroup.Value.GetSqlServers();
var operation = await serverCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-sql-server",
    serverData);

SqlServerResource server = operation.Value;

2. Create SQL Database

var databaseData = new SqlDatabaseData(AzureLocation.EastUS)
{
    Sku = new SqlSku("S0") { Tier = "Standard" },
    MaxSizeBytes = 2L * 1024 * 1024 * 1024, // 2 GB
    Collation = "SQL_Latin1_General_CP1_CI_AS",
    RequestedBackupStorageRedundancy = SqlBackupStorageRedundancy.Local
};

var databaseCollection = server.GetSqlDatabases();
var dbOperation = await databaseCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-database",
    databaseData);

SqlDatabaseResource database = dbOperation.Value;

3. Create Elastic Pool

var poolData = new ElasticPoolData(AzureLocation.EastUS)
{
    Sku = new SqlSku("StandardPool")
    {
        Tier = "Standard",
        Capacity = 100 // 100 eDTUs
    },
    PerDatabaseSettings = new ElasticPoolPerDatabaseSettings
    {
        MinCapacity = 0,
        MaxCapacity = 100
    }
};

var poolCollection = server.GetElasticPools();
var poolOperation = await poolCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-elastic-pool",
    poolData);

ElasticPoolResource pool = poolOperation.Value;

4. Add Database to Elastic Pool

var databaseData = new SqlDatabaseData(AzureLocation.EastUS)
{
    ElasticPoolId = pool.Id
};

await databaseCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "pooled-database",
    databaseData);

5. Configure Firewall Rules

// Allow Azure services
var azureServicesRule = new SqlFirewallRuleData
{
    StartIPAddress = "0.0.0.0",
    EndIPAddress = "0.0.0.0"
};

var firewallCollection = server.GetSqlFirewallRules();
await firewallCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "AllowAzureServices",
    azureServicesRule);

// Allow specific IP range
var clientRule = new SqlFirewallRuleData
{
    StartIPAddress = "203.0.113.0",
    EndIPAddress = "203.0.113.255"
};

await firewallCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "AllowClientIPs",
    clientRule);

6. List Resources

// List all servers in subscription
await foreach (var srv in subscription.GetSqlServersAsync())
{
    Console.WriteLine($"Server: {srv.Data.Name} in {srv.Data.Location}");
}

// List databases in a server
await foreach (var db in server.GetSqlDatabases())
{
    Console.WriteLine($"Database: {db.Data.Name}, SKU: {db.Data.Sku?.Name}");
}

// List elastic pools
await foreach (var ep in server.GetElasticPools())
{
    Console.WriteLine($"Pool: {ep.Data.Name}, DTU: {ep.Data.Sku?.Capacity}");
}

7. Get Connection String

// Build connection string (server FQDN is predictable)
var serverFqdn = $"{server.Data.Name}.database.windows.net";
var connectionString = $"Server=tcp:{serverFqdn},1433;" +
    $"Initial Catalog={database.Data.Name};" +
    "Persist Security Info=False;" +
    $"User ID={server.Data.AdministratorLogin};" +
    "Password=<your-password>;" +
    "MultipleActiveResultSets=False;" +
    "Encrypt=True;" +
    "TrustServerCertificate=False;" +
    "Connection Timeout=30;";

Key Types Reference

TypePurpose
ArmClientEntry point for all ARM operations
SqlServerResourceRepresents an Azure SQL server
SqlServerCollectionCollection for server CRUD
SqlDatabaseResourceRepresents a SQL database
SqlDatabaseCollectionCollection for database CRUD
ElasticPoolResourceRepresents an elastic pool
ElasticPoolCollectionCollection for elastic pool CRUD
SqlFirewallRuleResourceRepresents a firewall rule
SqlFirewallRuleCollectionCollection for firewall rule CRUD
SqlServerDataServer creation/update payload
SqlDatabaseDataDatabase creation/update payload
ElasticPoolDataElastic pool creation/update payload
SqlFirewallRuleDataFirewall rule creation/update payload
SqlSkuSKU configuration (tier, capacity)

Common SKUs

Database SKUs

SKU NameTierDescription
BasicBasic5 DTUs, 2 GB max
S0-S12Standard10-3000 DTUs
P1-P15Premium125-4000 DTUs
GP_Gen5_2GeneralPurposevCore-based, 2 vCores
BC_Gen5_2BusinessCriticalvCore-based, 2 vCores
HS_Gen5_2HyperscalevCore-based, 2 vCores

Elastic Pool SKUs

SKU NameTierDescription
BasicPoolBasic50-1600 eDTUs
StandardPoolStandard50-3000 eDTUs
PremiumPoolPremium125-4000 eDTUs
GP_Gen5_2GeneralPurposevCore-based
BC_Gen5_2BusinessCriticalvCore-based

Best Practices

  1. Use WaitUntil.Completed for operations that must finish before proceeding
  2. Use WaitUntil.Started when you want to poll manually or run operations in parallel
  3. Always use DefaultAzureCredential — never hardcode passwords in production
  4. Handle RequestFailedException for ARM API errors
  5. Use CreateOrUpdateAsync for idempotent operations
  6. Navigate hierarchy via Get* methods (e.g., server.GetSqlDatabases())
  7. Use elastic pools for cost optimization when managing multiple databases
  8. Configure firewall rules before attempting connections

Error Handling

using Azure;

try
{
    var operation = await serverCollection.CreateOrUpdateAsync(
        WaitUntil.Completed, serverName, serverData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
    Console.WriteLine("Server already exists");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
    Console.WriteLine($"Invalid request: {ex.Message}");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}

Reference Files

FileWhen to Read
references/server-management.mdServer CRUD, admin credentials, Azure AD auth, networking
references/database-operations.mdDatabase CRUD, scaling, backup, restore, copy
references/elastic-pools.mdPool management, adding/removing databases, scaling

Related SDKs

SDKPurposeInstall
Microsoft.Data.SqlClientData plane (execute queries, stored procedures)dotnet add package Microsoft.Data.SqlClient
Azure.ResourceManager.SqlManagement plane (this SDK)dotnet add package Azure.ResourceManager.Sql
Microsoft.EntityFrameworkCore.SqlServerORM for SQL Serverdotnet add package Microsoft.EntityFrameworkCore.SqlServer

Mehr Skills von microsoft

oss-growth
microsoft
OSS-Wachstums-Hacker-Persona
official
microsoft-foundry
microsoft
Foundry-Agenten end-to-end bereitstellen, evaluieren und verwalten: Docker-Build, ACR-Push, gehostete/Prompt-Agenten erstellen, Container starten, Batch-Evaluierung, kontinuierliche Evaluierung, Prompt-Optimizer-Workflows, agent.yaml, Datensatzkuration aus Traces. VERWENDUNG FÜR: Agent in Foundry bereitstellen, gehosteten Agenten, Agenten erstellen, Agenten aufrufen, Agenten evaluieren, Batch-Evaluierung ausführen, kontinuierliche Evaluierung, kontinuierliches Monitoring, Status der kontinuierlichen Evaluierung, Prompt optimieren, Prompt verbessern, Prompt-Optimizer, Agentenanweisungen optimieren, Agenten verbessern...
officialdevelopmentdevops
azure-ai
microsoft
Verwendung für Azure AI: Suche, Sprache, OpenAI, Dokumentenintelligenz. Hilft bei Suche, Vektor-/Hybridsuche, Sprach-zu-Text, Text-zu-Sprache, Transkription, OCR. WANN: KI-Suche, Abfragesuche, Vektorsuche, Hybridsuche, semantische Suche, Sprach-zu-Text, Text-zu-Sprache, Transkribieren, OCR, Text in Sprache umwandeln.
officialdevelopmentapi
azure-deploy
microsoft
Führen Sie Azure-Bereitstellungen für BEREITS VORBEREITETE Anwendungen aus, die vorhandene .azure/deployment-plan.md- und Infrastrukturdateien haben. Verwenden Sie diese Fähigkeit NICHT, wenn der Benutzer darum bittet, eine neue Anwendung zu ERSTELLEN – verwenden Sie stattdessen azure-prepare. Diese Fähigkeit führt azd up, azd deploy, terraform apply und az deployment-Befehle mit integrierter Fehlerbehebung aus. Erfordert .azure/deployment-plan.md von azure-prepare und validierten Status von azure-validate. WANN: "run azd up", "run azd deploy", "execute deployment",...
officialdevopsaws
azure-storage
microsoft
Azure Storage-Dienste, darunter Blob Storage, Dateifreigaben, Queue Storage, Table Storage und Data Lake. Beantwortet Fragen zu Speicherzugriffsebenen (heiß, kühl, kalt, Archiv), wann welche Ebene verwendet werden sollte, und zum Vergleich der Ebenen. Bietet Objektspeicher, SMB-Dateifreigaben, asynchrone Nachrichtenübermittlung, NoSQL-Schlüssel-Wert und Big-Data-Analysen. Beinhaltet Lebenszyklusverwaltung. VERWENDUNG FÜR: Blob-Speicher, Dateifreigaben, Queue-Speicher, Table-Speicher, Data Lake, Dateien hochladen, Blobs herunterladen, Speicherkonten, Zugriffsebenen,...
officialdevelopmentdatabase
azure-diagnostics
microsoft
Debuggen von Azure-Produktionsproblemen mit AppLens, Azure Monitor, Ressourcenintegrität und sicherer Triage. WANN: Debuggen von Produktionsproblemen, Fehlerbehebung bei App Service, hohe CPU-Auslastung im App Service, Fehler bei der App Service-Bereitstellung, Fehlerbehebung bei Container-Apps, Fehlerbehebung bei Functions, Fehlerbehebung bei AKS, kubectl kann keine Verbindung herstellen, kube-system/CoreDNS-Fehler, ausstehende Pods, Crashloop, Knoten nicht bereit, Upgrade-Fehler, Analyse von Protokollen, KQL, Einblicke, Fehler beim Image-Pull, Probleme mit Kaltstarts, Fehler bei Integritätsprüfungen,...
officialdevopsdevelopment
azure-prepare
microsoft
Bereiten Sie Azure-Apps für die Bereitstellung vor (Infra Bicep/Terraform, azure.yaml, Dockerfiles). Verwenden Sie für Erstellen/Modernisieren oder Erstellen+Bereitstellen; nicht für Cross-Cloud-Migration (verwenden Sie azure-cloud-migrate). NICHT VERWENDEN FÜR: Copilot-SDK-Apps (verwenden Sie azure-hosted-copilot-sdk). WANN: "App erstellen", "Web-App erstellen", "API erstellen", "serverlose HTTP-API erstellen", "Frontend erstellen", "Backend erstellen", "Dienst erstellen", "Anwendung modernisieren", "Anwendung aktualisieren", "Authentifizierung hinzufügen", "Caching hinzufügen", "auf Azure hosten", "erstellen und...
officialdevelopmentdevops
azure-validate
microsoft
Vor der Bereitstellung durchgeführte Validierung der Azure-Bereitschaft. Führen Sie umfassende Prüfungen der Konfiguration, Infrastruktur (Bicep oder Terraform), RBAC-Rollenzuweisungen, verwalteten Identitätsberechtigungen und Voraussetzungen durch, bevor Sie bereitstellen. WANN: meine App validieren, Bereitstellungsbereitschaft prüfen, Preflight-Prüfungen durchführen, Konfiguration verifizieren, prüfen, ob bereit zur Bereitstellung, azure.yaml validieren, Bicep validieren, vor der Bereitstellung testen, Bereitstellungsfehler beheben, Azure Functions validieren, Funktionen-App validieren, serverlos validieren...
officialdevopstesting