如何使用具有托管标识的自动化帐户 Runbook 运行 Azure SQL 服务器存储过程?
How to run an Azure SQL Server Stored Procedure using an Automation Account Runbook with Managed Identity?
我正在尝试 运行 SQL 服务器数据库索引和统计维护激活名为 AzureSQLMaintenance
的存储过程,使用自动化帐户中的 PowerShell Runbook。
因为我不想使用标准 SQL 服务器身份验证,所以我正在尝试使用托管身份。
我在网上发现一些 Microsoft 文档与 Microsoft 技术社区上的要点非常接近 here and here, but both the threads are missing some pieces. A very good clue clue was given to me by this blog post 但缺少托管身份验证
经过几天的测试,我终于成功了,所以我会把整个过程写下来,以防有人需要做同样的事情:
- 在帐户设置 > 身份 下,系统分配的托管身份必须设置为开启,我们需要
Object (principal) Id
,记得记下来
- 在我的 Azure SQL 数据库服务器中,在 设置 > Azure Active Directory 下,我们需要检查
Azure Active Directory admin
的值。就我而言,这是一个组
- 在Azure Active Directory中,编辑上一步个性化的组,将第1步得到的
Object (principal) Id
添加为组成员
- 需要在自动化帐户中创建 Powershell Runbook
- powershell Runbook 代码需要类似于
Write-Output "Run started"
# Instantiate the connection to the SQL Database
$sqlConnection = new-object System.Data.SqlClient.SqlConnection
# Connect to the the account used the Managed Identity
Connect-AzAccount -Identity
# Get a Token
$token = (Get-AzAccessToken -ResourceUrl https://database.windows.net ).Token
# Initialize the connection String
$sqlConnection.ConnectionString = "Data Source=db-server-name.database.windows.net;Initial Catalog=<db-name>;Connect Timeout=60"
# Set the Token to be used by the connection
$sqlConnection.AccessToken = $token
# Open the connection
$sqlConnection.Open()
Write-Output "Azure SQL database connection opened"
# Define the SQL command to run
$sqlCommand = new-object System.Data.SqlClient.SqlCommand
# Allow Long Executions
$sqlCommand.CommandTimeout = 0
# Associate the created connection
$sqlCommand.Connection = $sqlConnection
Write-Output "Issuing command to run stored procedure"
# Execute the SQL command
$sqlCommand.CommandText= 'exec [dbo].[AzureSQLMaintenance] @parameter1 = ''param1Value'', @parameter2 = ''param2Value'' '
$result = $sqlCommand.ExecuteNonQuery()
Write-Output "Stored procedure execution completed"
# Close the SQL connection
$sqlConnection.Close()
Write-Output "Run completed"
此时,运行 对 Runbook 进行了测试:在我的情况下它运行完美,即使它需要一段时间(这就是参数 $sqlCommand.CommandTimeout = 0
的原因)
我正在尝试 运行 SQL 服务器数据库索引和统计维护激活名为 AzureSQLMaintenance
的存储过程,使用自动化帐户中的 PowerShell Runbook。
因为我不想使用标准 SQL 服务器身份验证,所以我正在尝试使用托管身份。
我在网上发现一些 Microsoft 文档与 Microsoft 技术社区上的要点非常接近 here and here, but both the threads are missing some pieces. A very good clue clue was given to me by this blog post 但缺少托管身份验证
经过几天的测试,我终于成功了,所以我会把整个过程写下来,以防有人需要做同样的事情:
- 在帐户设置 > 身份 下,系统分配的托管身份必须设置为开启,我们需要
Object (principal) Id
,记得记下来 - 在我的 Azure SQL 数据库服务器中,在 设置 > Azure Active Directory 下,我们需要检查
Azure Active Directory admin
的值。就我而言,这是一个组 - 在Azure Active Directory中,编辑上一步个性化的组,将第1步得到的
Object (principal) Id
添加为组成员 - 需要在自动化帐户中创建 Powershell Runbook
- powershell Runbook 代码需要类似于
Write-Output "Run started"
# Instantiate the connection to the SQL Database
$sqlConnection = new-object System.Data.SqlClient.SqlConnection
# Connect to the the account used the Managed Identity
Connect-AzAccount -Identity
# Get a Token
$token = (Get-AzAccessToken -ResourceUrl https://database.windows.net ).Token
# Initialize the connection String
$sqlConnection.ConnectionString = "Data Source=db-server-name.database.windows.net;Initial Catalog=<db-name>;Connect Timeout=60"
# Set the Token to be used by the connection
$sqlConnection.AccessToken = $token
# Open the connection
$sqlConnection.Open()
Write-Output "Azure SQL database connection opened"
# Define the SQL command to run
$sqlCommand = new-object System.Data.SqlClient.SqlCommand
# Allow Long Executions
$sqlCommand.CommandTimeout = 0
# Associate the created connection
$sqlCommand.Connection = $sqlConnection
Write-Output "Issuing command to run stored procedure"
# Execute the SQL command
$sqlCommand.CommandText= 'exec [dbo].[AzureSQLMaintenance] @parameter1 = ''param1Value'', @parameter2 = ''param2Value'' '
$result = $sqlCommand.ExecuteNonQuery()
Write-Output "Stored procedure execution completed"
# Close the SQL connection
$sqlConnection.Close()
Write-Output "Run completed"
此时,运行 对 Runbook 进行了测试:在我的情况下它运行完美,即使它需要一段时间(这就是参数 $sqlCommand.CommandTimeout = 0
的原因)