适用于:✅Microsoft Fabric 中的 SQL 数据库
可以使用 Fabric REST API 以编程方式查看和配置 SQL 数据库审核设置。 SQL 审核设置 API 是一个数据库级 API,用于对单个 SQL 数据库进行操作。 通过将 API 与 PowerShell 脚本组合在一起,可以跨工作区中的所有数据库一致地管理审核。
本文演示如何使用 PowerShell 和数据库级 SQL 审核设置 REST API 检索和更新 Fabric 工作区中 SQL 数据库的审核设置。
先决条件
- 您需要已有的 Fabric 容量。 如果没有, 请启动 Fabric 试用版。
- 可以使用现有工作区或创建包含一个或多个 SQL 数据库 的新 Fabric 工作区 。
- 你必须是 工作区的管理员、成员或参与者角色 的成员才能管理审核设置。
- PowerShell 5.1 或 PowerShell 7.4 及更高版本。
- Az PowerShell 模块。 在 PowerShell 中运行
Install-Module az以安装。
审核 REST API 终结点
SQL 审核设置 API 提供两项操作用于管理单个 SQL 数据库的审核:
| 运算 | 方法 | URI |
|---|---|---|
| 获取 SQL 审核设置 | GET |
https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/sqlDatabases/{sqlDatabaseId}/settings/sqlAudit |
| 更新 SQL 审核设置 | PATCH |
https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/sqlDatabases/{sqlDatabaseId}/settings/sqlAudit |
Get 操作需要SQLDatabase.Read.All、SQLDatabase.ReadWrite.All、Item.Read.All或Item.ReadWrite.All委派的范围。
更新操作需要SQLDatabase.ReadWrite.All或Item.ReadWrite.All委托的范围。 这两项操作都支持用户标识、服务主体和托管标识。
审核设置属性
审核设置对象包含以下属性:
| 财产 | 类型 | 说明 |
|---|---|---|
auditActionsAndGroups |
字符串[] | 审核要捕获的操作和组。 默认值: BATCH_COMPLETED_GROUP、 FAILED_DATABASE_AUTHENTICATION_GROUP、 SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP. |
predicateExpression |
字符串 | 用于筛选审核事件的 T-SQL 谓词表达式。 例如, statement not like '[select ]%' 排除 SELECT 语句。 |
retentionDays |
整数 | 保留审核日志的天数。
0 指示无限期保留。 |
state |
字符串 | 审核状态: Enabled 或 Disabled。 首次在不指定其他属性的情况下启用审核时,系统将使用默认值。 |
storageEndpoint |
字符串 | (只读)存储审核日志的 OneLake 存储终结点。 |
查看工作区中所有数据库的审核设置
以下 PowerShell 脚本列出了工作区中的所有 SQL 数据库,并检索每个数据库的审核配置。
在以下脚本中,将 <your workspace id> 替换为你的 Fabric 工作区 ID。 您可以在 URL 中找到工作区的 ID,它是浏览器窗口中/groups/之后、两个/字符之间的唯一字符串。 例如,00001111-aaaa-2222-bbbb-3333cccc4444 中的 https://fabric.microsoft.com/groups/00001111-aaaa-2222-bbbb-3333cccc4444/。
Import-Module Az.Accounts
Connect-AzAccount
$workspaceId = '<your workspace id>'
$baseUri = "https://api.fabric.microsoft.com"
# Obtain an access token
$token = (Get-AzAccessToken -ResourceUrl "https://api.fabric.microsoft.com")
$secureToken = $token.Token | ConvertFrom-SecureString -AsPlainText
$headers = @{
"Authorization" = "Bearer $secureToken"
"Content-Type" = "application/json"
}
# List all SQL databases in the workspace
$databasesUri = "$baseUri/v1/workspaces/$workspaceId/sqlDatabases"
$databases = @()
$continuationToken = $null
do {
$url = $databasesUri
if ($continuationToken) {
$encoded = [System.Web.HttpUtility]::UrlEncode($continuationToken)
$url = "$url`?continuationToken=$encoded"
}
$response = Invoke-RestMethod -Method GET -Uri $url -Headers $headers
if ($response.value) { $databases += $response.value }
$continuationToken = $response.continuationToken
} while ($continuationToken)
Write-Host "Found $($databases.Count) SQL databases."
# Retrieve audit settings for each database
$results = @()
foreach ($db in $databases) {
try {
$auditUri = "$baseUri/v1/workspaces/$workspaceId/sqlDatabases/$($db.id)/settings/sqlAudit"
$audit = Invoke-RestMethod -Method GET -Uri $auditUri -Headers $headers
$results += [PSCustomObject]@{
DatabaseName = $db.displayName
DatabaseId = $db.id
State = $audit.state
RetentionDays = $audit.retentionDays
AuditActionsAndGroups = ($audit.auditActionsAndGroups -join "; ")
PredicateExpression = $audit.predicateExpression
}
}
catch {
$results += [PSCustomObject]@{
DatabaseName = $db.displayName
DatabaseId = $db.id
State = "ERROR"
RetentionDays = ""
AuditActionsAndGroups = ""
PredicateExpression = $_.Exception.Message
}
}
}
$results | Format-Table -AutoSize
为工作区中的所有数据库配置审核
查看当前审核状态后,使用以下脚本在工作区中的所有数据库之间一致地配置审核。
将 <your workspace id> 替换为你的 Fabric 工作区 ID。 修改对象 $auditPayload 以匹配所需的审核配置。
Import-Module Az.Accounts
Connect-AzAccount
$workspaceId = '<your workspace id>'
$baseUri = "https://api.fabric.microsoft.com"
# Obtain an access token
$token = (Get-AzAccessToken -ResourceUrl "https://api.fabric.microsoft.com")
$secureToken = $token.Token | ConvertFrom-SecureString -AsPlainText
$headers = @{
"Authorization" = "Bearer $secureToken"
"Content-Type" = "application/json"
}
# Define the audit configuration to apply
$auditPayload = @{
state = "Enabled"
auditActionsAndGroups = @(
"BATCH_COMPLETED_GROUP",
"FAILED_DATABASE_AUTHENTICATION_GROUP",
"SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP"
)
retentionDays = 10
predicateExpression = "statement not like '[select ]%'"
} | ConvertTo-Json -Depth 5
# List all SQL databases in the workspace
$databasesUri = "$baseUri/v1/workspaces/$workspaceId/sqlDatabases"
$databases = @()
$continuationToken = $null
do {
$url = $databasesUri
if ($continuationToken) {
$encoded = [System.Web.HttpUtility]::UrlEncode($continuationToken)
$url = "$url`?continuationToken=$encoded"
}
$response = Invoke-RestMethod -Method GET -Uri $url -Headers $headers
if ($response.value) { $databases += $response.value }
$continuationToken = $response.continuationToken
} while ($continuationToken)
Write-Host "Configuring auditing for $($databases.Count) SQL databases..."
foreach ($db in $databases) {
try {
$auditUri = "$baseUri/v1/workspaces/$workspaceId/sqlDatabases/$($db.id)/settings/sqlAudit"
Invoke-RestMethod -Method PATCH -Uri $auditUri -Headers $headers -Body $auditPayload | Out-Null
Write-Host "[OK] Updated auditing for: $($db.displayName)"
}
catch {
Write-Host "[FAIL] $($db.displayName): $($_.Exception.Message)"
}
}
最佳做法
- 在更新
GET之前,始终使用PATCH请求检索当前审核设置,以了解现有配置。 - 处理每个数据库的故障。 如果一个数据库更新失败,请继续处理剩余的数据库。
- 单独重试暂时性故障,而不是重新运行整个批量更新脚本。
- 在生产环境中使用服务主体或托管标识进行自动或计划的审核配置。