SQL AzureでSQL Server Agentを何とか実現させる方法: Part 1
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でワーカーロールを含むクラウドプロジェクトを作成します。これに関して、基本的な事を知りたい場合は、ここを参照してください。
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を実行させるのと同等です。
次のようなコードになります。
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回目では、一日の間で、特定の時間にストアドプロシージャを実行させる方法について紹介します。