Azure Runbook Automation调用嵌套Runbook。错误嵌套工作流

时间:2017-11-22 10:29:06

标签: powershell azure azure-automation azure-runbook

我对天蓝色的Runbook和自动化都很陌生。

我有几个azure Sql数据库,并且我希望在订单中运行数据库中的存储过程。在On premises SQL Server之前,我们有一个SQL作业代理来按顺序运行存储过程。做一些研究,看起来SQL作业代理被Azure自动化取代。

现在我想创建一个可以接受参数来逐个运行存储过程的Runbook。然后创建另一个Runbook,通过提供运行每个存储过程的参数来调用子Runbook。

我找到了一个脚本here,它允许我从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失败并显示消息:

  

嵌套工作流程不支持高级参数验证

在此链接here中,他们显示这是运行嵌套Runbook的方法:

知道问题在哪里?

2 个答案:

答案 0 :(得分:2)

ValidateNotNullOrEmpty 是错误所指的高级参数验证。 original example不使用它。

此外,除非您确实需要检查点或并行活动执行,否则请考虑使用普通的PowerShell Runbook而不是PowerShell Workflow:它们更容易创作和更快地启动。

答案 1 :(得分:1)

常规脚本和工作流程之间的关系并不多。我一直使用自动化的工作流程。

请查看“嘿,脚本专家!”中的这篇blog文章。在科技网上。他为新手撰写了一系列有关PowerShell的文章。

至于你的剧本,我试着保持简单。我经常为MS SQL TIPS编写代码,并在Azure SQL数据库中进行压缩article

这与您的问题有什么关系?

在本文中,我编写了PowerShell解决方案时经常使用的两个函数。

第一个直接适用于关于如何执行动态TSQL的问题。由于您正在控制输入,因此您不必担心注射。

第二个从SELECT语句返回数据表对象。这可以用作处理的输入。

该博客中显示了几个使用这些功能的例子。

快乐的编码。

约翰

Crafty 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" 
)