Azure ARM策略限制数据库Sku.name仅允许Basic和Standard部署问题排查
问题核心原因
你当前配置的核心错误是混淆了Azure SQL数据库SKU的两个属性:sku.tier(层级)和sku.name(具体规格):
- Basic层级的SKU,
sku.name和sku.tier值均为Basic,因此可以正常匹配通过 - Standard层级的SKU,
sku.tier值为Standard,但sku.name为Standard_S0、Standard_S1这类带具体规格标识的值,和你允许列表中的纯Standard无法匹配,因此被误拦截
另外你的原有策略还存在结构混用、未限定作用资源范围的问题,也可能导致异常。
修正后的完整配置
策略定义
{ "properties": { "displayName": "仅允许SQL数据库使用Basic和Standard层级SKU", "policyType": "Custom", "mode": "All", "description": "限制SQL数据库仅可部署Basic和Standard层级的SKU,拒绝其余层级部署", "parameters": { "listOfAllowedSKUTiers": { "type": "Array", "metadata": { "description": "允许使用的SQL数据库SKU层级列表", "displayName": "允许的SKU层级" }, "allowedValues": [ "Basic", "Standard" ], "defaultValue": [ "Basic", "Standard" ] } }, "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Sql/servers/databases" }, { "field": "kind", "notContains": "system" }, { "not": { "field": "Microsoft.Sql/servers/databases/sku.tier", "in": "[parameters('listOfAllowedSKUTiers')]" } } ] }, "then": { "effect": "Deny" } } }, "type": "Microsoft.Authorization/policyDefinitions", "name": "sql-db-allowed-sku-tiers" }
关键调整说明
- 字段替换:将原规则中的
sku.name判断改为sku.tier,直接匹配SKU层级,符合你的需求 - 范围限定:增加资源类型判断,仅对SQL数据库资源生效,避免误拦截其他资源
- 系统库过滤:排除SQL Server自带的系统数据库,避免策略影响基础服务运行
- 结构修正:移除原有错误的
strongType配置,调整参数元数据匹配实际用途
如果你需要限制的是具体SKU规格而非层级,可将判断字段改回sku.name,同时将允许列表调整为对应具体规格值,例如["Basic", "Standard_S0", "Standard_S1"]即可。
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

