0

我对天蓝色运行手册和自动化很陌生。

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

现在我想创建一个运行手册,它可以接受参数来一个一个地运行存储过程。然后通过提供参数来运行每个存储过程,创建另一个 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”
}

}

然后我想创建另一个运行手册并调用“SQL_Agent_SprocJob”子运行手册来传递参数。

这是我的父母手册:

    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!"
}

当我运行此运行手册时,运行手册失败并显示以下消息:

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

在此链接中他们展示了这是运行嵌套运行手册的方式:

知道问题出在哪里吗?

4

2 回答 2

2

ValidateNotNullOrEmpty是错误所指的高级参数验证。原始示例没有使用它。

此外,除非您确实需要检查点或并行活动执行,否则请考虑使用普通的 PowerShell 运行手册而不是 PowerShell 工作流:它们更容易编写和启动速度更快。

于 2017-11-22T18:17:07.940 回答
1

常规脚本和工作流程之间确实没有太多开销。我一直使用自动化的工作流程。

请查看“嘿,脚本专家!”的这篇博客文章。在科技网上。他为新手写了一系列关于 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" 
)
于 2017-11-24T00:49:50.943 回答