如何使用Azure自动化运行存储过程?

11

我对Azure平台非常新,也许这是一个愚蠢的问题,但我没能找到有关此主题的信息。我真的需要帮助。我正在为大学项目部署Web服务使用的数据库。在这个数据库中,我有一个存储过程,需要每天运行一次。

发现使用Azure自动化可以编程或安排此类操作。我“安装”了该服务,并尝试创建“runbook”,但不知道如何编写代码,因为我从未那么多地使用PowerShell。

任何提供的帮助将不胜感激。谢谢!

编辑1:

所以我正在尝试使用此代码来实现:

 workflow WORKFLOW_NAME
{ 
    param( 

    ) 


    inlinescript { 
        # Define the connection to the SQL Database 
        $Conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=SERVER_NAME.database.windows.net;Initial Catalog=DATABASE_NAME;Integrated Security=False;User ID=USERNAME;Password=PASSWORD;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False") 

        # Open the SQL connection 
        $Conn.Open() 

        # Define the SQL command to run. 
        $Cmd=new-object system.Data.SqlClient.SqlCommand("exec PROCEDURE_NAME", $Conn) 
        $Cmd.CommandTimeout=120 

        # Execute the SQL command 
        $Da=New-Object system.Data.SqlClient.SqlDataAdapter($Cmd) 

        # Close the SQL connection 
        $Conn.Close() 
    } 
}
问题是我保存并发布RunBook时,它显示没有错误。当我运行RunBook时,它开始并完成发送,没有错误或异常,所以你可以期望它完成了工作,但是在查询数据库时,表格中的修改并没有被执行。这可能是什么问题?我做错了什么?
我从https://gallery.technet.microsoft.com/scriptcenter/How-to-use-a-SQL-Command-be77f9d2#content中引用了参考代码,进行个性化处理,并且摆脱了“param”,因为运行RunBook时,从未要求输入参数,所以我决定使用完整的连接字符串。我正在使用与我的C#项目相同的连接字符串,该连接正常连接并工作。
我正在使用“新”的Azure界面,不知道这是否与此有关。
再次感谢您能提供的任何帮助。

你必须添加 $using:somParam 来访问 inlinescript 中的参数。请参阅 https://technet.microsoft.com/zh-cn/library/jj574197(v=ws.11).aspx。 - Mitch Stewart
2个回答

8
我找到了问题的核心,代码运行良好,问题在于我在Azure Automation中使用了错误类型的RunBook,所以请确保您正在运行Workflow PowerShell而不是简单的PowerShell。
我在问题中发布的代码可以工作,但是我发现通过使用此处提供的示例https://azure.microsoft.com/en-us/blog/azure-automation-your-sql-agent-in-the-cloud/(感谢@Joseph Idziorek),可以更好地理解代码。
以下是对于任何遇到与我相同问题的人的可行代码:
workflow NAME-OF-YOUR-WORKFLOW
{
    Write-Output "JOB START BEFORE INLINESCRIPT"

    inlinescript
    {
        Write-Output "JOB START"
        # Create connection to Master DB
        $MasterDatabaseConnection = New-Object System.Data.SqlClient.SqlConnection
        $MasterDatabaseConnection.ConnectionString = "Data Source=YOUR-DATABASE-SERVER-NAME.database.windows.net;Initial Catalog=YOUR-DATABASE-NAME;Integrated Security=False;User ID=YOUR-DATABASE-USERNAME;Password=YOUR-DATABASE-PASSWORD;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False"
        $MasterDatabaseConnection.Open()

        Write-Output "CONNECTION OPEN"

        # Create command
        $MasterDatabaseCommand = New-Object System.Data.SqlClient.SqlCommand
        $MasterDatabaseCommand.Connection = $MasterDatabaseConnection
        $MasterDatabaseCommand.CommandText = "YOUR-PROCEDURE-NAME"

        Write-Output "DATABASE COMMAND TEXT ASSIGNED"

        # Execute the query
        $MasterDatabaseCommand.ExecuteNonQuery()

        Write-Output "EXECUTING QUERY"

        # Close connection to Master DB
        $MasterDatabaseConnection.Close() 

        Write-Output "CONNECTION CLOSED"
    }    
    Write-Output "WORK END - AFTER INLINESCRIPT"
}

Write-outputs是可选的,如果您想在每次运行后检查代码的哪个部分正在工作以及是否一切正常。

2
你应该能够将此脚本作为PowerShell工作流 (PowerShell Workflow) 运行,就像上面的例子一样,或者通过进行一些小的代码更改,将其作为简单的PowerShell脚本运行。在inlinescript中包装您的代码实际上会使这些cmdlet作为常规PowerShell运行。如果您正在使用PowerShell脚本runbook,请删除InlineScript和Workflow,然后它应该可以正常工作。作为常规PowerShell运行实际上是首选的方法,因为您的脚本启动得更快,而不需要编译。 - Elizabeth Cooper
非常感谢您的建议。我会按照您说的尝试使用它,因为我对PowerShell真的很菜。 - Mario Puglisi
1
@ElizabethCooper,你的这句话“如果你正在使用PowerShell脚本runbook,请删除InlineScript和Workflow,它应该可以正常工作”对我很有帮助。我在官方文档网站上找不到它,或者在阅读时错过了它。我使用了workflow和inlinescript,但无法使“hello world”输出正常工作。在本地没有使用workflow和inline script就可以正常工作,这就是原因。谢谢!我已经点赞了你的评论。 - JP Hellemons
@MarioAlejandroPuglisiVieira 你必须使用“Run As”账户才能使这个解决方案工作吗? - George D.

0

非常感谢您的快速回复,事实上我已经看过那篇文章了。我正在尝试理解它的代码并稍作修改以便用于我所需的用途,但是它没有起作用。 - Mario Puglisi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接