如何用PowerShell/Bash批量删除Azure Purview集合资产(AAD认证)
批量删除Azure Purview集合内资产的实现方案
前提条件
- 已安装Azure PowerShell模块(版本≥5.1)或Azure CLI(版本≥2.40.0)
- 已通过AAD账户登录Azure(
Connect-AzAccount或az login) - 拥有目标Purview账户的集合管理员权限
- 提前获取目标集合的集合ID(可通过Purview UI的集合详情页获取,或调用API查询)
PowerShell实现方案
1. 定义基础变量
$purviewAccountName = "your-purview-account-name" # 替换为你的Purview账户名 $collectionId = "your-collection-id" # 替换为目标集合ID $apiBaseUrl = "https://$purviewAccountName.purview.azure.com/catalog/api/atlas/v2"
2. 获取Purview API访问令牌
$accessToken = (Get-AzAccessToken -ResourceUrl "https://purview.azure.com").Token $headers = @{ "Authorization" = "Bearer $accessToken" "Content-Type" = "application/json" }
3. 分页获取集合内所有资产GUID
$allAssetGuids = @() $nextPageToken = $null do { $queryParams = if ($nextPageToken) { "?filter=collectionId eq '$collectionId'&nextPageToken=$nextPageToken" } else { "?filter=collectionId eq '$collectionId'" } $response = Invoke-RestMethod -Method Get -Uri "$apiBaseUrl/entity/bulk$queryParams" -Headers $headers $allAssetGuids += $response.entities.guid $nextPageToken = $response.nextPageToken } while ($nextPageToken)
4. 批量删除资产
Purview API单次支持最多删除1000个资产,因此需要分批处理:
$batchSize = 1000 for ($i=0; $i -lt $allAssetGuids.Count; $i+=$batchSize) { $batchGuids = $allAssetGuids[$i..($i+$batchSize-1)] $deleteBody = @{ guids = $batchGuids } | ConvertTo-Json try { Invoke-RestMethod -Method Post -Uri "$apiBaseUrl/entity/bulk/delete" -Headers $headers -Body $deleteBody Write-Host "成功删除第 $($i/$batchSize + 1) 批资产(共 $($batchGuids.Count) 个)" } catch { Write-Host "删除第 $($i/$batchSize + 1) 批资产失败:$($_.Exception.Message)" } }
Azure Cloud Bash(Azure CLI)实现方案
1. 定义基础变量
PURVIEW_ACCOUNT_NAME="your-purview-account-name" # 替换为你的Purview账户名 COLLECTION_ID="your-collection-id" # 替换为目标集合ID API_BASE_URL="https://$PURVIEW_ACCOUNT_NAME.purview.azure.com/catalog/api/atlas/v2"
2. 获取Purview API访问令牌
ACCESS_TOKEN=$(az account get-access-token --resource https://purview.azure.com --query accessToken -o tsv) HEADERS=(-H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json")
3. 分页获取集合内所有资产GUID
ALL_ASSET_GUIDS=() NEXT_PAGE_TOKEN="" while true; do QUERY_PARAMS="" if [ -n "$NEXT_PAGE_TOKEN" ]; then QUERY_PARAMS="?filter=collectionId eq '$COLLECTION_ID'&nextPageToken=$NEXT_PAGE_TOKEN" else QUERY_PARAMS="?filter=collectionId eq '$COLLECTION_ID'" fi RESPONSE=$(curl -s "${API_BASE_URL}/entity/bulk$queryParams" "${HEADERS[@]}") CURRENT_GUIDS=$(echo "$RESPONSE" | jq -r '.entities[].guid') ALL_ASSET_GUIDS+=($CURRENT_GUIDS) NEXT_PAGE_TOKEN=$(echo "$RESPONSE" | jq -r '.nextPageToken') if [ "$NEXT_PAGE_TOKEN" == "null" ]; then break fi done
4. 批量删除资产
同样按1000个/批处理:
BATCH_SIZE=1000 TOTAL_GUIDS=${#ALL_ASSET_GUIDS[@]} for ((i=0; i<TOTAL_GUIDS; i+=BATCH_SIZE)); do BATCH_GUIDS=("${ALL_ASSET_GUIDS[@]:i:BATCH_SIZE}") DELETE_BODY=$(jq -n --argjson guids "$(printf '%s\n' "${BATCH_GUIDS[@]}" | jq -R . | jq -s .)" '{guids: $guids}') RESPONSE=$(curl -s -X POST "${API_BASE_URL}/entity/bulk/delete" "${HEADERS[@]}" -d "$DELETE_BODY") if [ $(echo "$RESPONSE" | jq -r '.guidAssignments | length') -eq ${#BATCH_GUIDS[@]} ]; then echo "成功删除第 $((i/BATCH_SIZE + 1)) 批资产(共 ${#BATCH_GUIDS[@]} 个)" else echo "删除第 $((i/BATCH_SIZE + 1)) 批资产失败:$(echo "$RESPONSE" | jq -r '.error.message')" fi done
注意事项
- 执行删除前建议先验证资产列表,避免误删:可将删除步骤替换为打印GUID列表确认
- 若资产数量极大,建议在非业务高峰时段执行,避免影响Purview服务性能
- 部分特殊资产(如通过扫描生成的资产)可能需要先删除扫描规则或关联资源,否则可能重新被同步
内容的提问来源于stack exchange,提问作者mytabi
相关产品推荐
相关产品推荐

