在 Azure 门户中创建单一数据库:
浏览到“选择 SQL 部署选项”页。
在“SQL 数据库”下将“资源类型”设置保留为“单一数据库”,然后选择“创建” 。
在“创建 SQL 数据库”窗体的“基本信息”选项卡上的“项目详细信息”下,选择要使用的 Azure订阅。
对于“资源组”,选择“新建”,输入“myResourceGroup”,然后选择“确定” 。
对于“数据库名称”,请输入“demo”。
对于“服务器”,选择“新建”。 使用以下值填写“新建服务器”窗体:
- 服务器名称:输入“mysqlserver”并添加一些字符以实现唯一性。 我们无法提供要使用的确切服务器名称,因为对于 Azure 中的所有服务器,服务器名称必须全局唯一,而不只是在订阅中唯一。 输入类似于 mysqlserver12345 的名称,然后门户会告知你是否可用。
- 服务器管理员登录名:输入“azureuser”。
- 密码:输入符合要求的密码。 在“确认密码”框中再次输入。
- 位置:从下拉列表中选择一个位置。
- 允许 Azure 服务访问此服务器:选择此选项以启用对摘要存储的访问。
选择“确定”。
将“想要使用 SQL 弹性池”设置保留为“否” 。
在“计算 + 存储”下选择“配置数据库” 。
此快速入门使用无服务器数据库,因此请选择“无服务器”,然后选择“应用” 。
在“网络”选项卡上,对于“连接方法”,选择“公共终结点” 。
对于“防火墙规则”,将“添加当前客户端 IP 地址”设置为“是” 。 将“允许 Azure 服务和资源访问此服务器”设置保留为“否” 。
在页面底部选择“下一步: 安全”。
在“安全”选项卡上的“账本”部分中,选择“配置账本”选项 。
在“配置账本”窗格的“账本”部分中,选中“为此数据库中所有将来的表启用”复选框 。 此设置确保数据库中未来的所有表都是账本表。 为此,数据库中的所有数据都将显示任何篡改证据。 默认情况下,即使未在 CREATE TABLE 中指定 LEDGER = ON
,新表也将被创建为可更新的账本表。 也可以不选择此选项。 使用 SQL Transact-SQL 创建新表时,需要在每个表的基础上启用账本功能。
在“摘要存储”部分,将自动选择“启用自动摘要存储”。 然后,将创建一个新的 Azure 存储帐户和存储摘要的容器。
选择“应用”。
在页面底部选择“查看 + 创建”。
在“查看 + 创建”页上,查看后选择“创建”。
你将使用 Azure CLI 创建资源组、逻辑数据库服务器、单个账本数据库并配置上传账本摘要。
启动 Azure Cloud Shell
Azure Cloud Shell 是免费的交互式 shell,可以使用它运行本文中的步骤。 它预安装有常用 Azure 工具并将其配置与帐户一起使用。
若要打开 Cloud Shell,请从代码块的右上角选择试一试。 也可以通过转到 https://shell.azure.com 在单独的浏览器标签页中启动 Cloud Shell。 选择“复制”以复制代码块,将其粘贴到 Cloud Shell 中,然后按 Enter 来运行它。
设置参数值
后续命令使用以下值来创建数据库和所需资源。 服务器名称和存储帐户名称需要在整个 Azure 中全局唯一,因此,$RANDOM 函数将用于创建服务器名称和存储帐户名称。
资源名称必须在你的订阅中唯一。 将 <your resource group name>
替换为唯一名称,将 <your subscription ID>
替换为你的订阅 ID。
替换 IP 地址范围中的 0.0.0.0 值,以匹配你的特定环境。
将 westeurope 替换为首选的 Azure 区域名称。
resourceGroupName="<your resource group name>"
location="westeurope"
serverName="mysqlserver"-$RANDOM
databaseName="myLedgerDatabase"
storageAccountName="mystorage"$RANDOM
subscription="<your subscription ID>"
adminLogin=azureuser
adminPassword=<password>
serverResourceId="/subscriptions/$subscription/resourceGroups/$resourceGroupName/providers/Microsoft.Sql/servers/$serverName"
# The ip address range that you want to allow to access your server
startIP=0.0.0.0
endIP=0.0.0.0
# Set variables for your digest storage location
storageAccountName="mystorage"$RANDOM
storageAccountURL1="https://"
storageAccountURL3=".blob.core.windows.net"
storageAccountURL=$storageAccountURL1$storageAccountName$storageAccountURL3
storageAccountResourceId="/subscriptions/$subscription/resourceGroups/$resourceGroupName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
# Show resource names
echo "Resource group name is" $resourceGroupName
echo "Server name is" $serverName
echo "Database name is" $databaseName
echo "Storage account name is" $storageAccountName
创建资源组
使用“az group create”命令创建资源组。 Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。
az group create --name $resourceGroupName --location $location
创建带有托管标识的服务器
使用 az sql server create 命令创建服务器。 该命令创建分配有托管标识的服务器。
az sql server create \
--name $serverName \
--resource-group $resourceGroupName \
--location $location \
--admin-user $adminLogin \
--admin-password $adminPassword \
--assign-identity
此命令将 ID 存储在一个变量中,该变量稍后将用来向服务器授予上传账本摘要的权限。
# Retrieves the assigned identity to be used when granting the server access to the storage account
principalId=`az sql server show \
--name $serverName \
--resource-group $resourceGroupName \
--query identity.principalId \
--output tsv`
使用 az sql server firewall-rule create 命令创建防火墙规则。
az sql server firewall-rule create \
--resource-group $resourceGroupName \
--server $serverName \
-n AllowYourIp \
--start-ip-address $startIP \
--end-ip-address $endIP
创建单个账本数据库
使用 az sql db create 命令创建账本数据库。 以下命令创建启用了账本的无服务器数据库。
az sql db create \
--resource-group $resourceGroupName \
--server $serverName \
--name $databaseName \
--edition GeneralPurpose \
--family Gen5 \
--capacity 2 \
--compute-model Serverless \
--ledger-on
创建存储帐户
使用 az storage account create 命令创建存储帐户来存储账本摘要。
az storage account create \
--name $storageAccountName \
--resource-group $resourceGroupName \
--location $location \
--sku Standard_GRS \
--kind StorageV2
授予服务器写入账本摘要的权限
使用 az role assignment create 命令将服务器的托管标识分配给存储 Blob 数据参与者角色。 这为 SQL 服务器提供了将数据库摘要发布到存储帐户的适当权限。
az role assignment create \
--assignee-object-id $principalId \
--assignee-principal-type "ServicePrincipal" \
--role "Storage Blob Data Contributor" \
--scope $storageAccountResourceId
启用数据库摘要上传
使用 az sql db ledger-digest-uploads enable 命令更新数据库,开始将账本摘要上传到存储帐户。
az sql db ledger-digest-uploads enable \
--name $databaseName \
--resource-group $resourceGroupName \
--server $serverName \
--endpoint $storageAccountURL
若要防止删除或更新摘要,建议使用 az storage container immutability-policy create 和 az storage container immutability-policy lock 命令在 sqldbledgerdigests 容器上配置基于时间的保留策略。 该策略必须允许受保护的追加 Blob 写入操作。 这会确保数据库服务器可将包含新摘要的块添加到现有 Blob,同时在指定的不可变性时段内禁止删除或更新摘要。
重要
以下示例使用的不可变性时段值为 1 天。 在生产环境中,应该使用大得多的值。
备注
开始将数据库摘要上传到存储帐户后,将无法删除存储帐户,直到不可变性策略过期。 如果计划在此快速入门之后立即清理资源,可以跳过设置不可变性策略。
若要详细了解容器的基于时间的保留策略,请参阅为容器配置不可变性策略。
az storage container immutability-policy create \
--resource-group $resourceGroupName \
--account-name $storageAccountName \
--container-name sqldbledgerdigests \
--period 1 \
--allow-protected-append-writes true
# Retrieves the etag value of the policy to be used when the policy is locked
etag=`az storage container immutability-policy show \
--account-name $storageAccountName \
--container-name sqldbledgerdigests \
--query etag \
--output tsv`
etag="${etag/$'\r'/}"
az storage container immutability-policy lock \
--resource-group $resourceGroupName \
--account-name $storageAccountName \
--container-name sqldbledgerdigests \
--if-match $etag
你将使用 Windows PowerShell 创建资源组、逻辑数据库服务器、单个账本数据库并配置上传账本摘要。
启动 Azure Cloud Shell
Azure Cloud Shell 是免费的交互式 shell,可以使用它运行本文中的步骤。 它预安装有常用 Azure 工具并将其配置与帐户一起使用。
若要打开 Cloud Shell,请从代码块的右上角选择试一试。 也可以通过转到 https://shell.azure.com 在单独的浏览器标签页中启动 Cloud Shell。 选择“复制”以复制代码块,将其粘贴到 Cloud Shell 中,然后按 Enter 来运行它。
设置参数值
后续命令使用以下值来创建数据库和所需资源。 服务器名称和存储帐户名称需要在整个 Azure 中全局唯一,因此,Get-Random cmdlet 将用于创建服务器名称和存储帐户名称。
资源名称必须在你的订阅中唯一。 将 <your resource group name>
替换为唯一名称。
替换 IP 地址范围中的 0.0.0.0 值,以匹配你的特定环境。
将 westeurope 替换为首选的 Azure 区域名称。
# Set variables for your server and database
$resourceGroupName = "<your resource group name>"
$location = "westeurope"
$serverName = "mysqlserver-$(Get-Random)"
$databaseName = "myLedgerDatabase"
$storageAccountName = "mystorage$(Get-Random)"
# The ip address range that you want to allow to access your server
$startIP = "0.0.0.0"
$endIP = "0.0.0.0"
# Show resource names
Write-host "Resource group name is" $resourceGroupName
Write-host "Server name is" $serverName
Write-host "Storage account name is" $storageAccountName
创建资源组
使用 New-AzResourceGroup 创建 Azure 资源组。 资源组是在其中部署和管理 Azure 资源的逻辑容器。
Write-host "Creating resource group..."
$resourceGroup = New-AzResourceGroup `
-Name $resourceGroupName `
-Location $location
$resourceGroup
创建服务器
使用 New-AzSqlServer cmdlet 创建服务器。
该 cmdlet 创建分配有托管标识的服务器,你稍后需要向此服务器授予上传账本摘要的权限。
系统提示时,输入 SQL 管理员用户名和密码。
Write-host "Creating primary server..."
$server = New-AzSqlServer `
-ResourceGroupName $resourceGroupName `
-ServerName $serverName `
-Location $location `
-AssignIdentity `
-SqlAdministratorCredentials (Get-Credential)
$server
创建防火墙规则
使用 New-AzSqlServerFirewallRule cmdlet 创建服务器防火墙规则。
Write-host "Configuring server firewall rule..."
$serverFirewallRule = New-AzSqlServerFirewallRule -ResourceGroupName $resourceGroupName `
-ServerName $serverName `
-FirewallRuleName "AllowedIPs" -StartIpAddress $startIP -EndIpAddress $endIP
$serverFirewallRule
创建单个账本数据库
使用 New-AzSqlDatabase cmdlet 创建单一账本数据库。
以下示例创建无服务器数据库。
Write-host "Creating a gen5 2 vCore serverless ledger database..."
$database = New-AzSqlDatabase -ResourceGroupName $resourceGroupName `
-ServerName $serverName `
-DatabaseName $databaseName `
-Edition GeneralPurpose `
-ComputeModel Serverless `
-ComputeGeneration Gen5 `
-VCore 2 `
-MinimumCapacity 2 `
-EnableLedger
$database
创建存储帐户
使用 New-AzStorageAccount cmdlet 创建存储帐户来存储账本摘要。
Write-host "Creating a storage account for ledger digests..."
$storage = New-AzStorageAccount -ResourceGroupName $resourceGroupName `
-Name $storageAccountName `
-Location $location `
-SkuName Standard_RAGRS `
-Kind StorageV2 `
-AccessTier Hot
$storage
授予服务器写入账本摘要的权限
使用 New-AzRoleAssignment cmdlet 将服务器的托管标识分配给存储 Blob 数据参与者角色。 这为 SQL 服务器提供了将数据库摘要发布到存储帐户的适当权限。
Write-host "Granting the server access to the storage account..."
$assignment = New-AzRoleAssignment `
-ObjectId $server.Identity.PrincipalId `
-RoleDefinitionName "Storage Blob Data Contributor" `
-ResourceGroupName $resourceGroupName `
-ResourceType "Microsoft.Storage/storageAccounts" `
-ResourceName $storageAccountName
$assignment
启用数据库摘要上传
使用 Enable-AzSqlDatabaseLedgerDigestUpload cmdlet 更新数据库,开始将账本摘要上传到存储帐户。 该数据库服务器将在存储帐户中创建名为 sqldbledgerdigests 的新容器,并开始将账本摘要写入容器。
Write-host "Enabling ledger digest upload..."
$ledgerDigestUploadConfig = Enable-AzSqlDatabaseLedgerDigestUpload `
-ResourceGroupName $resourceGroupName `
-ServerName $serverName `
-DatabaseName $databaseName `
-Endpoint $storage.PrimaryEndpoints.Blob
$ledgerDigestUploadConfig
若要防止删除或更新摘要,建议使用 Set-AzRmStorageContainerImmutabilityPolicy 和 Lock-AzRmStorageContainerImmutabilityPolicy cmdlet 在 sqldbledgerdigests 容器上配置基于时间的保留策略。 该策略必须允许受保护的追加 Blob 写入操作。 这会确保数据库服务器可将包含新摘要的块添加到现有 Blob,同时在指定的不可变性时段内禁止删除或更新摘要。
重要
以下示例使用的不可变性时段值为 1 天。 在生产环境中,应该使用大得多的值。
备注
在指定的不可变性时段内无法删除容器或存储帐户。
若要详细了解容器的基于时间的保留策略,请参阅为容器配置不可变性策略。
Write-host "Configuring a time-based retention policy..."
$immutabilityPerdiod = 1
$containerName = "sqldbledgerdigests"
$policy = Set-AzRmStorageContainerImmutabilityPolicy `
-ResourceGroupName $resourceGroupName `
-StorageAccountName $storageAccountName `
-ContainerName $containerName `
-AllowProtectedAppendWrite $true `
-ImmutabilityPeriod $immutabilityPerdiod
Lock-AzRmStorageContainerImmutabilityPolicy `
-ResourceGroupName $resourceGroupName `
-StorageAccountName $storageAccountName `
-ContainerName $containerName `
-Etag $policy.Etag