SQL AzureでSQL Server Agentを何とか実現させる方法: Part 1

2010-08-08

I Miss You SQL Server Agent: Part 1 – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

今のところ、SQL Azureはクラウド上でのSQL Server Agentの動作をサポートしていません。SQL Azureで、SQL Server Agentの機能が必要な場合は、Windows Azureワーカーロールとカスタムコードで代用できます。このシリーズで、代用する方法を紹介します。

 

SQL Server Agent

SQL Server Agentは、ジョブと呼ばれる管理タスクをスケジュール実行するためのMicrosoft Windows サービスです。SQL Server Agentは、SQL Serverに格納されたジョブ情報を使用します。ジョブは、一つ以上のジョブステップを含んでいます。各ステップは、データベースバックアップのようにSQL Server自信のタスクも含んでいます。SQL Server Agentは、ジョブをスケジュール実行、特定のイベント結果を受けての実行、呼び出されての実行に対応しています。例えば、平日業務後、全ての会社のサーバをバックアップしたい場合、SQL Server Agentを使用すれば自動実行させることができます。月曜から金曜までの22時以降起動するバックアップをスケジュールします。もしバックアップ実行に問題が発生した場合、SQL Server Agentはイベントを記録し、あなたに通知します。SQL Server AgentはオンプレミスのEnterprise、Datacenter、StandardエディションのSQL Serverにインストールされますが、ExpressとCompactエディションには提供されていません。

 

ワーカーロール

ワーカーロールはクラウド上の基本的なWindowsサービスです。ワーカーロールを開始させたとき、エンドレスループをするようにデザインされています。

  • シングルプロセスイベントを確認する
  • 動作を実行する
  • 次に確認する必要ができるまでスリープする様々な目的で使用できるように、ワーカーロールは意図的に抽象的になっています。

注意事項:ワーカーロールは意図的に抽象化されており、SQL Server Agentは開発されており、一年程度で製品提供されると思うので、ワーカーロールで完璧にSQL Server Agentの機能を複製するつもりはありません。代わりに、Windows AzureワーカーロールからSQL Server Agentが行うような多くのタスクを実現できるように、いくつかのアイディアとシンプルなコードを提供しようと思っています。

 

初めに

初めに、Visual Studioでワーカーロールを含むクラウドプロジェクトを作成します。これに関して、基本的な事を知りたい場合は、ここを参照してください。

vs01

WorkerRole.vbと呼ばれるファイルにいくつかのサンプルコードが生成されます。

public override Sub Run()
    ' これは WorkerRole1 の実装例です。実際のロジックに置き換えてください。
    Trace.WriteLine("WorkerRole1 entry point called", "Information");

    While (True)
        Thread.Sleep(10000);
        Trace.WriteLine("Working", "Information");
    End While
End Sub

最初にすることは、SQL Azureデータベース上でストアドプロシージャを実行させるコードを書くことです。これは、SQL Server Agentジョブ内のステップでTransact-SQLを実行させるのと同等です。

vs02

次のようなコードになります。

    Protected Sub ExecuteTestJob()

        Using sqlConnection As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("AdventureWorksLTAZ2008R2").ConnectionString)

            Try

                '接続を開く

                sqlConnection.Open()



                Dim sqlCommand As SqlCommand = New SqlCommand("spTest", sqlConnection)

                sqlCommand.CommandType = System.Data.CommandType.StoredProcedure



                sqlCommand.ExecuteNonQuery()



            Catch ex As SqlException

                Trace.WriteLine("SqlException", "Error")

                Throw

            End Try

        End Using

    End Sub

基本的にはSQL Azure上で、SqlCommand.ExecuteNonQuery()メソッドを使用して、データを返さないストアドプロシージャを実行します。SQL Server Agentのように何も結果を返しません。

 

例外のハンドリング

 

上の例では、Windows AzureワーカーロールでSQL Server Agent版を作成するための最初のステップなので、例外のハンドリングがとても貧相になっています。

SQL Server Agentのロジックから、成功したら次のステップへ進み、失敗したらジョブを終了し、失敗を報告するものを使用する場合、ワーカーロールでtry/catchを使用してSQL Server Agentの動作をシミュレーションします。このシリーズの3回目でエラーハンドリングの問題について取り組みます。

 

まとめ


このシリーズの2回目では、一日の間で、特定の時間にストアドプロシージャを実行させる方法について紹介します。