Автоматизация Runbook Azure Вызов вложенного Runbook. ошибка Расширенная проверка параметров не поддерживается во вложенных рабочих процессах
Я совсем новичок в лазурных Runbook и автоматизации.
У меня есть несколько баз данных Azure Sql, и в базах данных есть хранимые процедуры, которые я хотел бы запустить по порядку. Раньше в локальной среде SQL Server у нас был агент заданий SQL для выполнения хранимых процедур по порядку. В некоторых исследованиях похоже, что агент заданий SQL заменен на Azure Automation.
Теперь я хотел бы создать Runbook, который будет принимать параметры для запуска хранимых процедур по одной. Затем создайте еще один модуль Runbook для вызова дочернего модуля Runbook, указав параметры для запуска каждой хранимой процедуры.
Я нашел здесь скрипт, который позволяет мне запускать хранимые процедуры из Runbook.
вот скрипт runbook:
workflow SQL_Agent_SprocJob
{
[cmdletbinding()]
param
(
# Fully-qualified name of the Azure DB server
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $SqlServerName,
# Name of database to connect and execute against
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $DBName,
# Name of stored procedure to be executed
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $StoredProcName,
# Credentials for $SqlServerName stored as an Azure Automation credential asset
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[PSCredential] $Credential
)
inlinescript
{
Write-Output “JOB STARTING”
# Setup variables
$ServerName = $Using:SqlServerName
$UserId = $Using:Credential.UserName
$Password = ($Using:Credential).GetNetworkCredential().Password
$DB = $Using:DBName
$SP = $Using:StoredProcName
# Create & Open connection to Database
$DatabaseConnection = New-Object System.Data.SqlClient.SqlConnection
$DatabaseConnection.ConnectionString = “Data Source = $ServerName; Initial Catalog = $DB; User ID = $UserId; Password = $Password;”
$DatabaseConnection.Open();
Write-Output “CONNECTION OPENED”
# Create & Define command and query text
$DatabaseCommand = New-Object System.Data.SqlClient.SqlCommand
$DatabaseCommand.CommandType = [System.Data.CommandType]::StoredProcedure
$DatabaseCommand.Connection = $DatabaseConnection
$DatabaseCommand.CommandText = $SP
Write-Output “EXECUTING QUERY”
# Execute the query
$DatabaseCommand.ExecuteNonQuery()
# Close connection to DB
$DatabaseConnection.Close()
Write-Output “CONNECTION CLOSED”
Write-Output “JOB COMPLETED”
}
}
Затем я хотел бы создать еще один модуль Runbook и вызвать дочерний модуль Runbook "SQL_Agent_SprocJob" для передачи параметров.
Вот мой родительский Runbook:
workflow HelloWorldStoredProcedure
{
$SqlServerName = "mydbserver.database.windows.net"
Write-Output $SqlServerName
SQL_Agent_SprocJob -SqlServerName $SqlServerName -Credential "myCredentialName" -DBName "myDbName" -StoredProcName "dbo.HelloWorld"
Write-Output "Complete!"
}
Когда я запускаю этот runbook, runbook завершается с сообщением:
Расширенная проверка параметров не поддерживается во вложенных рабочих процессах.
В этой ссылке они показывают, что это способ запуска вложенных модулей Runbook:
Есть идеи, где проблема?
2 ответа
ValidateNotNullOrEmpty - это расширенная проверка параметров, на которую ссылается ошибка. Оригинальный пример не использует это.
Кроме того, если вам действительно не нужны контрольные точки или параллельное выполнение действий, рассмотрите возможность использования простых модулей Runbook PowerShell вместо PowerShell Workflow: их гораздо проще создавать и запускать быстрее.
На самом деле между обычным сценарием и рабочим процессом не так много накладных расходов. Я всегда использовал рабочие процессы с автоматизацией.
Пожалуйста, посмотрите на эту статью в блоге от "Эй, парень сценариев!" в сети. Он написал большую серию статей о PowerShell для новичков.
Что касается вашего сценария, я стараюсь сделать вещи простыми. Я часто пишу для MS SQL TIPS и написал статью о сжатии в базе данных Azure SQL.
Как это относится к вашему вопросу?
Внутри этой статьи есть две функции, которые я часто использовал при кодировании решений PowerShell.
Первый относится непосредственно к вашему вопросу о том, как выполнить динамический TSQL. Поскольку вы управляете вводом, вам не нужно беспокоиться о инъекции.
Второй возвращает объект таблицы данных из оператора SELECT. Это может быть использовано в качестве входных данных для вашей обработки.
Несколько примеров использования этих функций приведены в этом блоге.
Удачного кодирования.
Джон
Хитрый DBA
Имя: Exec-NonQuery-SqlDb Назначение: Выполнить оператор DELETE, INSERT, UPDATE или DDL.
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[String] $ConnStr,
[Parameter(Mandatory = $true)]
[string] $SqlQry
)
Имя: Get-DataSet-SqlDb()
Назначение: получить данные из запроса SELECT.
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[String] $ConnStr,
[Parameter(Mandatory = $true)]
[string] $SqlQry,
[Parameter(Mandatory=$false)]
[ValidateSet("DataSet", "DataTable", "DataRow")]
[string]$As="DataRow"
)