使用 Azure 自动化管理 Azure SQL 数据库中的数据库

本文介绍使用 Azure 自动化的系统分配的托管标识连接和管理 Azure SQL 数据库中的数据库的过程。 通过 Azure 自动化,可以使用 Azure Az PowerShell 中提供的最新 Az PowerShell cmdlet 来管理 Azure SQL 数据库中的数据库。

Azure 自动化现成地提供了这些 Azure Az PowerShell cmdlet,因此你可以在该服务中执行所有 SQL 数据库管理任务。 还可以将 Azure 自动化中的这些 cmdlet 与其他 Azure 服务的 cmdlet 搭配使用,以便跨 Azure 服务和第三方系统自动完成复杂的任务。

Azure 自动化还可以使用 PowerShell 对 SQL Server 发出 T-SQL (Transact SQL) 命令。

若要对数据库运行该命令,需要执行以下操作:

  • 确保自动化帐户有一个系统分配的托管标识。
  • 向自动化托管标识提供适当的权限。
  • 配置 SQL Server 以利用 Microsoft Entra 身份验证。
  • 在 SQL Server 上创建映射到自动化帐户托管标识的用户。
  • 创建 Runbook 以连接和执行该命令。
  • (可选)如果 SQL Server 受防火墙保护,则创建混合 Runbook 辅助角色 (HRW),在该服务器上安装 SQL 模块,并将 HRW IP 地址添加到防火墙上的允许列表。

使用系统分配的托管标识连接到 Azure SQL 数据库

若要允许从自动化系统托管标识访问 Azure SQL 数据库,请执行以下步骤:

  1. 如果自动化系统托管标识为“禁用”,请执行以下操作:

    1. 登录 Azure 门户

    2. 转到“自动化帐户”。

    3. 在“自动化帐户”页的“帐户设置”下,选择“标识”。

    4. 在“系统分配”选项卡下,将“状态”选择为“启用”。

      将系统分配的托管标识的状态设置为“启用”的屏幕截图。

  2. 在系统托管标识处于“启用”状态后,必须使用以下步骤为帐户提供所需的访问权限:

    1. 在“自动化帐户”|“标识”页的“系统分配”选项卡中,在“权限”下选择“Azure 角色分配”。
    2. 在“Azure 角色分配”页中,选择“+ 添加角色分配(预览)”。
    3. 在“添加角色分配(预览)”中,将“范围”选择为“SQL”,从下拉列表中选择“订阅”、“资源”,根据所需的最低权限选择“角色”,然后选择“保存”。

    添加角色分配的屏幕截图(系统分配的托管标识的状态设置为“启用”时)。

  3. 使用以下步骤为 Active Directory 身份验证配置 SQL Server:

    1. 转到 Azure 门户主页并选择“SQL Server”。
    2. 在“SQL Server”页的“设置”下,选择“Microsoft Entra ID”。
    3. 选择“设置管理员”,为 AD 身份验证配置 SQL Server。
  4. 使用以下步骤在 SQL 端添加身份验证:

    1. 转到 Azure 门户主页并选择“SQL Server”。
    2. 在“SQL Server”页的“设置”下,选择“SQL 数据库”。
    3. 选择你的数据库以转到“SQL 数据库”页,选择“查询编辑器(预览)”并执行以下两个查询
      # AutomationAccount - replace with your Automation account's name
      # ObjectID - replace with object (principal) ID for your system managed identity principal from step 1.
      CREATE USER "AutomationAccount" FROM EXTERNAL PROVIDER WITH OBJECT_ID = `ObjectID`
      EXEC sp_addrolemember `db_owner`, "AutomationAccount"
      

代码示例

与 Azure SQL Server 的连接

if ($($env:computerName) -eq "Client") {"Runbook running on Azure Client sandbox"} else {"Runbook running on " + $env:computerName}
Disable-AzContextAutosave -Scope Process
Connect-AzAccount -Environment AzureChinaCloud -Identity
$Token = (Get-AZAccessToken -ResourceUrl https://database.chinacloudapi.cn).Token
Invoke-Sqlcmd -ServerInstance azuresqlserverxyz.database.chinacloudapi.cn -Database MyDBxyz -AccessToken $token -query 'select * from TableXYZ' 

检查 SQL 端的帐户权限

SELECT roles.[name] as role_name, members.name as [user_name] 
from sys.database_role_members 
Join sys.database_principals roles on database_role_members.role_principal_id= roles.principal_id 
join sys.database_principals members on database_role_members.member_principal_id=members.principal_id 
Order By 
roles.[name], members.[name] 

注意

当 SQL Server 在防火墙后运行时,必须在自己网络中的计算机上运行 Azure 自动化 Runbook。 确保将此计算机配置为混合 Runbook 辅助角色,使防火墙不会阻止 IP 地址或网络。 有关如何将计算机配置为混合辅助角色的详细信息,请参阅创建混合辅助角色

使用混合辅助角色

使用混合辅助角色时,Runbook 使用的模块必须从提升的 PowerShell 提示符在本地安装。 例如 - Install-module Az.Accounts and Install-module SqlServer。 若要查找所需的模块名称,请在每个 cmdlet 上运行一个命令,然后检查源。 例如,若要为属于 Az.Account 模块的 cmdlet Connect-AzAccount -Environment AzureChinaClouds 检查模块名称,请运行以下命令:get-command Connect-AzAccount -Environment AzureChinaCloud

注意

建议在打算在混合辅助角色上运行的任何 Runbook 的顶部添加以下代码:if ($($env:computerName) -eq "CLIENT") {"Runbook running on Azure CLIENT"} else {"Runbook running on " + $env:computerName}。 该代码使你能够查看运行它的节点,如果意外在 Azure 云而不是混合辅助角色上运行,则它有助于确定 Runbook 无法工作的原因。

后续步骤