Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Azure PostgreSQL Flexible Server SDK for .NET. Database management for PostgreSQL Flexible Server deployments.
.claude/skills/lingxling-azure-resource-manager-postgresql-dotnet/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 106% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 135% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 132% | 0% |
Azure Resource Manager SDK for managing PostgreSQL Flexible Server deployments.
bashdotnet add package Azure.ResourceManager.PostgreSql dotnet add package Azure.Identity
Current Version: v1.2.0 (GA) API Version: 2023-12-01-preview
> Note: This skill focuses on PostgreSQL Flexible Server. Single Server is deprecated and scheduled for retirement.
bashAZURE_SUBSCRIPTION_ID=<your-subscription-id> AZURE_RESOURCE_GROUP=<your-resource-group> AZURE_POSTGRESQL_SERVER_NAME=<your-postgresql-server>
csharpusing Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.PostgreSql; using Azure.ResourceManager.PostgreSql.FlexibleServers; ArmClient client = new ArmClient(new DefaultAzureCredential());
Subscription
└── ResourceGroup
└── PostgreSqlFlexibleServer # PostgreSQL Flexible Server instance
├── PostgreSqlFlexibleServerDatabase # Database within the server
├── PostgreSqlFlexibleServerFirewallRule # IP firewall rules
├── PostgreSqlFlexibleServerConfiguration # Server parameters
├── PostgreSqlFlexibleServerBackup # Backup information
├── PostgreSqlFlexibleServerActiveDirectoryAdministrator # Entra ID admin
└── PostgreSqlFlexibleServerVirtualEndpoint # Read replica endpointscsharpusing Azure.ResourceManager.PostgreSql.FlexibleServers; using Azure.ResourceManager.PostgreSql.FlexibleServers.Models; ResourceGroupResource resourceGroup = await client .GetDefaultSubscriptionAsync() .Result .GetResourceGroupAsync("my-resource-group"); PostgreSqlFlexibleServerCollection servers = resourceGroup.GetPostgreSqlFlexibleServers(); PostgreSqlFlexibleServerData data = new PostgreSqlFlexibleServerData(AzureLocation.EastUS) { Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose), AdministratorLogin = "pgadmin", AdministratorLoginPassword = "YourSecurePassword123!", Version = PostgreSqlFlexibleServerVersion.Ver16, Storage = new PostgreSqlFlexibleServerStorage { StorageSizeInGB = 128, AutoGrow = StorageAutoGrow.Enabled, Tier = PostgreSqlStorageTierName.P30 }, Backup = new PostgreSqlFlexibleServerBackupProperties { BackupRetentionDays = 7, GeoRedundantBackup = PostgreSqlFlexibleServerGeoRedundantBackupEnum.Disabled }, HighAvailability = new PostgreSqlFlexibleServerHighAvailability { Mode = PostgreSqlFlexibleServerHighAvailabilityMode.ZoneRedundant, StandbyAvailabilityZone = "2" }, AvailabilityZone = "1", AuthConfig = new PostgreSqlFlexibleServerAuthConfig { ActiveDirectoryAuth = PostgreSqlFlexibleServerActiveDirectoryAuthEnum.Enabled, PasswordAuth = PostgreSqlFlexibleServerPasswordAuthEnum.Enabled } }; ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql-server", data); PostgreSqlFlexibleServerResource server = operation.Value; Console.WriteLine($"Server created: {server.Data.FullyQualifiedDomainName}");
csharpPostgreSqlFlexibleServerResource server = await resourceGroup .GetPostgreSqlFlexibleServerAsync("my-postgresql-server"); PostgreSqlFlexibleServerDatabaseCollection databases = server.GetPostgreSqlFlexibleServerDatabases(); PostgreSqlFlexibleServerDatabaseData dbData = new PostgreSqlFlexibleServerDatabaseData { Charset = "UTF8", Collation = "en_US.utf8" }; ArmOperation<PostgreSqlFlexibleServerDatabaseResource> operation = await databases .CreateOrUpdateAsync(WaitUntil.Completed, "myappdb", dbData); PostgreSqlFlexibleServerDatabaseResource database = operation.Value; Console.WriteLine($"Database created: {database.Data.Name}");
csharpPostgreSqlFlexibleServerFirewallRuleCollection firewallRules = server.GetPostgreSqlFlexibleServerFirewallRules(); // Allow specific IP range PostgreSqlFlexibleServerFirewallRuleData ruleData = new PostgreSqlFlexibleServerFirewallRuleData { StartIPAddress = System.Net.IPAddress.Parse("10.0.0.1"), EndIPAddress = System.Net.IPAddress.Parse("10.0.0.255") }; ArmOperation<PostgreSqlFlexibleServerFirewallRuleResource> operation = await firewallRules .CreateOrUpdateAsync(WaitUntil.Completed, "allow-internal", ruleData); // Allow Azure services PostgreSqlFlexibleServerFirewallRuleData azureServicesRule = new PostgreSqlFlexibleServerFirewallRuleData { StartIPAddress = System.Net.IPAddress.Parse("0.0.0.0"), EndIPAddress = System.Net.IPAddress.Parse("0.0.0.0") }; await firewallRules.CreateOrUpdateAsync(WaitUntil.Completed, "AllowAllAzureServicesAndResourcesWithinAzureIps", azureServicesRule);
csharpPostgreSqlFlexibleServerConfigurationCollection configurations = server.GetPostgreSqlFlexibleServerConfigurations(); // Get current configuration PostgreSqlFlexibleServerConfigurationResource config = await configurations .GetAsync("max_connections"); // Update configuration PostgreSqlFlexibleServerConfigurationData configData = new PostgreSqlFlexibleServerConfigurationData { Value = "500", Source = "user-override" }; ArmOperation<PostgreSqlFlexibleServerConfigurationResource> operation = await configurations .CreateOrUpdateAsync(WaitUntil.Completed, "max_connections", configData); // Common PostgreSQL configurations to tune string[] commonParams = { "max_connections", "shared_buffers", "work_mem", "maintenance_work_mem", "effective_cache_size", "log_min_duration_statement" };
csharpPostgreSqlFlexibleServerActiveDirectoryAdministratorCollection admins = server.GetPostgreSqlFlexibleServerActiveDirectoryAdministrators(); PostgreSqlFlexibleServerActiveDirectoryAdministratorData adminData = new PostgreSqlFlexibleServerActiveDirectoryAdministratorData { PrincipalType = PostgreSqlFlexibleServerPrincipalType.User, PrincipalName = "aad-admin@contoso.com", TenantId = Guid.Parse("<tenant-id>") }; ArmOperation<PostgreSqlFlexibleServerActiveDirectoryAdministratorResource> operation = await admins .CreateOrUpdateAsync(WaitUntil.Completed, "<entra-object-id>", adminData);
csharp// List servers in resource group await foreach (PostgreSqlFlexibleServerResource server in resourceGroup.GetPostgreSqlFlexibleServers()) { Console.WriteLine($"Server: {server.Data.Name}"); Console.WriteLine($" FQDN: {server.Data.FullyQualifiedDomainName}"); Console.WriteLine($" Version: {server.Data.Version}"); Console.WriteLine($" State: {server.Data.State}"); Console.WriteLine($" SKU: {server.Data.Sku.Name} ({server.Data.Sku.Tier})"); Console.WriteLine($" HA: {server.Data.HighAvailability?.Mode}"); } // List databases in server await foreach (PostgreSqlFlexibleServerDatabaseResource db in server.GetPostgreSqlFlexibleServerDatabases()) { Console.WriteLine($"Database: {db.Data.Name}"); }
csharp// List available backups await foreach (PostgreSqlFlexibleServerBackupResource backup in server.GetPostgreSqlFlexibleServerBackups()) { Console.WriteLine($"Backup: {backup.Data.Name}"); Console.WriteLine($" Type: {backup.Data.BackupType}"); Console.WriteLine($" Completed: {backup.Data.CompletedOn}"); } // Point-in-time restore PostgreSqlFlexibleServerData restoreData = new PostgreSqlFlexibleServerData(AzureLocation.EastUS) { CreateMode = PostgreSqlFlexibleServerCreateMode.PointInTimeRestore, SourceServerResourceId = server.Id, PointInTimeUtc = DateTimeOffset.UtcNow.AddHours(-2) }; ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql-restored", restoreData);
csharpPostgreSqlFlexibleServerData replicaData = new PostgreSqlFlexibleServerData(AzureLocation.WestUS) { CreateMode = PostgreSqlFlexibleServerCreateMode.Replica, SourceServerResourceId = server.Id, Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose) }; ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql-replica", replicaData);
csharpPostgreSqlFlexibleServerResource server = await resourceGroup .GetPostgreSqlFlexibleServerAsync("my-postgresql-server"); // Stop server (saves costs when not in use) await server.StopAsync(WaitUntil.Completed); // Start server await server.StartAsync(WaitUntil.Completed); // Restart server await server.RestartAsync(WaitUntil.Completed, new PostgreSqlFlexibleServerRestartParameter { RestartWithFailover = true, FailoverMode = PostgreSqlFlexibleServerFailoverMode.PlannedFailover });
csharpPostgreSqlFlexibleServerResource server = await resourceGroup .GetPostgreSqlFlexibleServerAsync("my-postgresql-server"); PostgreSqlFlexibleServerPatch patch = new PostgreSqlFlexibleServerPatch { Sku = new PostgreSqlFlexibleServerSku("Standard_D4ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose), Storage = new PostgreSqlFlexibleServerStorage { StorageSizeInGB = 256, Tier = PostgreSqlStorageTierName.P40 } }; ArmOperation<PostgreSqlFlexibleServerResource> operation = await server .UpdateAsync(WaitUntil.Completed, patch);
csharpPostgreSqlFlexibleServerResource server = await resourceGroup .GetPostgreSqlFlexibleServerAsync("my-postgresql-server"); await server.DeleteAsync(WaitUntil.Completed);
| Type | Purpose | |------|---------| | PostgreSqlFlexibleServerResource | Flexible Server instance | | PostgreSqlFlexibleServerData | Server configuration data | | PostgreSqlFlexibleServerCollection | Collection of servers | | PostgreSqlFlexibleServerDatabaseResource | Database within server | | PostgreSqlFlexibleServerFirewallRuleResource | IP firewall rule | | PostgreSqlFlexibleServerConfigurationResource | Server parameter | | PostgreSqlFlexibleServerBackupResource | Backup metadata | | PostgreSqlFlexibleServerActiveDirectoryAdministratorResource | Entra ID admin | | PostgreSqlFlexibleServerSku | SKU (compute tier + size) | | PostgreSqlFlexibleServerStorage | Storage configuration | | PostgreSqlFlexibleServerHighAvailability | HA configuration | | PostgreSqlFlexibleServerBackupProperties | Backup settings | | PostgreSqlFlexibleServerAuthConfig | Authentication settings |
| Tier | Use Case | SKU Examples | |------|----------|--------------| | Burstable | Dev/test, light workloads | Standard_B1ms, Standard_B2s | | GeneralPurpose | Production workloads | Standard_D2ds_v4, Standard_D4ds_v4 | | MemoryOptimized | High memory requirements | Standard_E2ds_v4, Standard_E4ds_v4 |
| Version | Enum Value | |---------|------------| | PostgreSQL 11 | Ver11 | | PostgreSQL 12 | Ver12 | | PostgreSQL 13 | Ver13 | | PostgreSQL 14 | Ver14 | | PostgreSQL 15 | Ver15 | | PostgreSQL 16 | Ver16 |
| Mode | Description | |------|-------------| | Disabled | No HA (single server) | | SameZone | HA within same availability zone | | ZoneRedundant | HA across availability zones |
csharpusing Azure; try { ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql", data); } catch (RequestFailedException ex) when (ex.Status == 409) { Console.WriteLine("Server already exists"); } catch (RequestFailedException ex) when (ex.Status == 400) { Console.WriteLine($"Invalid configuration: {ex.Message}"); } catch (RequestFailedException ex) { Console.WriteLine($"Azure error: {ex.Status} - {ex.Message}"); }
After creating the server, connect using:
csharp// Npgsql connection string string connectionString = $"Host={server.Data.FullyQualifiedDomainName};" + "Database=myappdb;" + "Username=pgadmin;" + "Password=YourSecurePassword123!;" + "SSL Mode=Require;Trust Server Certificate=true;"; // With Entra ID token (recommended) var credential = new DefaultAzureCredential(); var token = await credential.GetTokenAsync( new TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" })); string connectionString = $"Host={server.Data.FullyQualifiedDomainName};" + "Database=myappdb;" + $"Username=aad-admin@contoso.com;" + $"Password={token.Token};" + "SSL Mode=Require;";
| SDK | Purpose | Install | |-----|---------|---------| | Azure.ResourceManager.PostgreSql | PostgreSQL management (this SDK) | dotnet add package Azure.ResourceManager.PostgreSql | | Azure.ResourceManager.MySql | MySQL management | dotnet add package Azure.ResourceManager.MySql | | Npgsql | PostgreSQL data access | dotnet add package Npgsql | | Npgsql.EntityFrameworkCore.PostgreSQL | EF Core provider | dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL |
| Resource | URL | |----------|-----| | NuGet Package | https://www.nuget.org/packages/Azure.ResourceManager.PostgreSql | | API Reference | https://learn.microsoft.com/dotnet/api/azure.resourcemanager.postgresql | | Product Documentation | https://learn.microsoft.com/azure/postgresql/flexible-server/ | | GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/postgresql/Azure.ResourceManager.PostgreSql |
This skill is applicable to execute the workflow or actions described in the overview.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 17,063 | 12,152 | -29% | 1 | 1 | 0% | 3,686 | 6,613 | +79% | 0 | 0 | — |
case-02 | fail→pass | 18,898 | 9,964 | -47% | 1 | 1 | 0% | 2,928 | 6,044 | +106% | 0 | 0 | — |
case-03 | pass→pass | 18,205 | 18,530 | +2% | 1 | 1 | 0% | 2,804 | 6,582 | +135% | 0 | 0 | — |
case-04 | pass→pass | 16,418 | 16,410 | -0% | 1 | 1 | 0% | 3,163 | 7,326 | +132% | 0 | 0 | — |
case-05 | pass→pass | 12,814 | 9,521 | -26% | 1 | 1 | 0% | 2,709 | 5,762 | +113% | 0 | 0 | — |
case-06 | pass→pass | 7,053 | 2,505 | -64% | 1 | 1 | 0% | 1,134 | 4,255 | +275% | 0 | 0 | — |
case-07 | pass→pass | 10,685 | 5,451 | -49% | 1 | 1 | 0% | 1,480 | 4,615 | +212% | 0 | 0 | — |
case-08 | pass→pass | 5,222 | 3,498 | -33% | 1 | 1 | 0% | 931 | 4,496 | +383% | 0 | 0 | — |
case-09 | pass→pass | 6,850 | 4,301 | -37% | 1 | 1 | 0% | 1,090 | 4,421 | +306% | 0 | 0 | — |
case-10 | pass→pass | 13,774 | 12,640 | -8% | 1 | 1 | 0% | 2,571 | 5,721 | +123% | 0 | 0 | — |
case-11 | pass→pass | 13,034 | 12,089 | -7% | 1 | 1 | 0% | 2,451 | 5,670 | +131% | 0 | 0 | — |
case-12 | pass→pass | 15,208 | 10,025 | -34% | 1 | 1 | 0% | 2,189 | 5,459 | +149% | 0 | 0 | — |
case-13 | pass→pass | 8,968 | 2,978 | -67% | 1 | 1 | 0% | 1,520 | 4,384 | +188% | 0 | 0 | — |
case-14 | pass→pass | 20,511 | 10,667 | -48% | 1 | 1 | 0% | 4,046 | 6,293 | +56% | 0 | 0 | — |
case-15 | pass→pass | 25,832 | 10,972 | -58% | 1 | 1 | 0% | 2,526 | 5,533 | +119% | 0 | 0 | — |
case-16 | pass→pass | 10,953 | 6,861 | -37% | 1 | 1 | 0% | 1,654 | 5,250 | +217% | 0 | 0 | — |
case-17 | fail→pass | 14,324 | 7,879 | -45% | 1 | 1 | 0% | 2,685 | 5,018 | +87% | 0 | 0 | — |
case-18 | pass→pass | 10,159 | 10,076 | -1% | 1 | 1 | 0% | 1,886 | 5,524 | +193% | 0 | 0 | — |
case-19 | pass→pass | 9,295 | 4,787 | -48% | 1 | 1 | 0% | 1,426 | 4,856 | +241% | 0 | 0 | — |
case-20 | pass→pass | 14,169 | 8,002 | -44% | 1 | 1 | 0% | 2,529 | 5,324 | +111% | 0 | 0 | — |
case-21 | pass→pass | 16,122 | 9,775 | -39% | 1 | 1 | 0% | 2,364 | 5,260 | +123% | 0 | 0 | — |
case-22 | pass→pass | 5,499 | 2,531 | -54% | 1 | 1 | 0% | 837 | 4,210 | +403% | 0 | 0 | — |
case-23 | pass→pass | 13,304 | 11,094 | -17% | 1 | 1 | 0% | 2,469 | 5,409 | +119% | 0 | 0 | — |
case-24 | pass→pass | 10,263 | 4,099 | -60% | 1 | 1 | 0% | 1,436 | 4,678 | +226% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +13 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.