如何可靠判别数据库或SQL Server是否为Azure托管?
可靠判别Azure托管SQL数据库的方法
仅靠服务器域名判断的局限性
- Azure SQL托管实例的域名格式并非
database.windows.net结尾(例如xxx.public.yyy.database.windows.net),会导致漏判。 - 若配置自定义域名指向Azure SQL数据库,域名不含
database.windows.net,会导致误判。
推荐的可靠判别方法
方法1:通过SERVERPROPERTY('EngineEdition')属性判断
这是官方推荐的最可靠方式,不同Azure SQL服务对应明确的引擎版本取值:
- 5 = Azure SQL Database
- 6 = Azure Synapse Analytics
- 8 = Azure SQL Managed Instance
- 9 = Azure SQL Edge
- 11 = Azure Synapse serverless SQL pool
C#实现代码:
using System.Data.SqlClient; using System.Collections.Generic; public class AzureSqlChecker { public bool IsAzureManagedSql(string connectionString) { // 定义所有Azure托管SQL对应的引擎版本值 var azureEngineEditions = new HashSet<int> { 5, 6, 8, 9, 11 }; using (var connection = new SqlConnection(connectionString)) { connection.Open(); using (var command = new SqlCommand("SELECT SERVERPROPERTY('EngineEdition')", connection)) { var result = command.ExecuteScalar(); if (result != DBNull.Value && int.TryParse(result.ToString(), out int edition)) { return azureEngineEditions.Contains(edition); } } } return false; } }
方法2:查询Azure特有的系统视图
sys.dm_db_resource_stats是Azure SQL Database和托管实例特有的性能统计视图,本地SQL Server不存在该视图。通过尝试查询该视图可判断是否为Azure托管:
C#实现代码:
using System.Data.SqlClient; public class AzureSqlChecker { public bool IsAzureManagedSql(string connectionString) { using (var connection = new SqlConnection(connectionString)) { connection.Open(); using (var command = new SqlCommand("SELECT 1 FROM sys.dm_db_resource_stats", connection)) { try { command.ExecuteScalar(); return true; } catch (SqlException) { // 视图不存在,说明非Azure托管SQL return false; } } } } }
总结
优先使用方法1,因为它覆盖了所有Azure托管的SQL服务类型,不受域名配置影响,是最稳定可靠的判断方式。
内容的提问来源于stack exchange,提问作者the1.9gpaProgrammer
相关产品推荐
相关产品推荐

