我对天蓝色的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的方法:
知道问题在哪里?
答案 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"
)