ストアド プロシージャ アクティビティを使用して SSIS パッケージを実行する

適用対象: Azure Data Factory Azure Synapse Analytics

ヒント

企業向けのオールインワン分析ソリューション、Microsoft Fabric の Data Factory をお試しください。 Microsoft Fabric は、データ移動からデータ サイエンス、リアルタイム分析、ビジネス インテリジェンス、レポートまで、あらゆるものをカバーしています。 無料で新しい試用版を開始する方法について説明します。

この記事では、ストアド プロシージャ アクティビティを使用して、SSIS パッケージを Azure Data Factory パイプラインまたは Synapse Pipelines で実行する方法を説明します。

前提条件

Azure SQL データベース

この記事のチュートリアルでは、SSIS カタログをホストする Azure SQL データベースを使用します。 Azure SQL Managed Instance を使うこともできます。

Data Factory

このチュートリアルを実装するには、Azure Data Factory のインスタンスが必要です。 まだプロビジョニングしていない場合は、「クイック スタート: Azure portal と Azure Data Factory Studio を使用してデータ ファクトリを作成する」の手順に従うことができます。

Azure-SSIS 統合ランタイム

最後に、Azure-SSIS 統合ランタイムがない場合は、SSIS パッケージのデプロイに関するチュートリアルの手順に従ってそれを入手する必要もあります。

ストアド プロシージャ アクティビティを含むパイプラインを作成する

この手順では、データ ファクトリ UI を使用してパイプラインを作成します。 Azure Data Factory Studio にまだ移動していない場合は、Azure portal でデータ ファクトリを開き、[Open Azure Data Factory Studio] ボタンをクリックして開きます。

Screenshot of the Azure Data Factory home page.

次に、ストアド プロシージャ アクティビティを新しいパイプラインに追加し、sp_executesql ストアド プロシージャを使用して、SSIS パッケージを実行するように構成します。

  1. ホーム ページで、 [調整] をクリックします。

    Screenshot that shows the Orchestrate button on the Azure Data Factory home page.

  2. [アクティビティ] ツールボックスで [ストアド プロシージャ] を検索し、パイプライン デザイナー画面に [ストアド プロシージャ] アクティビティをドラッグ アンド ドロップします。

    Drag-and-drop stored procedure activity

  3. デザイナー画面に追加したばかりの [ストアド プロシージャ] アクティビティを、次に [設定] タブをを選択し、[リンク サービス] の横にある [+ 新規] をクリックします。 SSIS カタログ (SSIDB データベース) をホストする Azure SQL Database 内のデータベースへの接続を作成します。

    New linked service button

  4. [New Linked Service](新しいリンクされたサービス) ウィンドウで、次の手順を行います。

    1. [種類][Azure SQL Database] を選択します。

    2. SSISDB データベースをホストしている Azure SQL Database に接続するために、既定の AutoResolveIntegrationRuntime を選択します。

    3. [サーバー名] フィールドで、SSISDB データベースをホストしている Azure SQL Database を選択します。

    4. [データベース名][SSISDB] を選択します。

    5. [ユーザー名] に、データベースにアクセスするユーザーの名前を入力します。

    6. [パスワード] に、ユーザーのパスワードを入力します。

    7. [テスト接続] ボタンをクリックして、データベースへの接続をテストします。

    8. [保存] ボタンをクリックして、リンクされたサービスを保存します。

      Screenshot that shows the process for adding a new linked service.

  5. [設定] タブの [プロパティ] ウィンドウに戻り、次の手順を実行します。

    1. [編集] を選択します。

    2. [ストアド プロシージャ名] フィールドに、「sp_executesql」と入力します。

    3. [ストアド プロシージャ パラメーター] セクションで [+ 新規] をクリックします。

    4. パラメーターの [名前] に、「stmt」と入力します。

    5. パラメーターの [型] に、「String」と入力します。

    6. パラメーターの [値] に、次の SQL クエリを入力します。

      SQL クエリで、folder_nameproject_name、および package_name パラメーターに適切な値を指定します。

      DECLARE @return_value INT, @exe_id BIGINT, @err_msg NVARCHAR(150)    EXEC @return_value=[SSISDB].[catalog].[create_execution] @folder_name=N'<FOLDER name in SSIS Catalog>', @project_name=N'<PROJECT name in SSIS Catalog>', @package_name=N'<PACKAGE name>.dtsx', @use32bitruntime=0, @runinscaleout=1, @useanyworker=1, @execution_id=@exe_id OUTPUT    EXEC [SSISDB].[catalog].[set_execution_parameter_value] @exe_id, @object_type=50, @parameter_name=N'SYNCHRONIZED', @parameter_value=1    EXEC [SSISDB].[catalog].[start_execution] @execution_id=@exe_id, @retry_count=0    IF(SELECT [status] FROM [SSISDB].[catalog].[executions] WHERE execution_id=@exe_id)<>7 BEGIN SET @err_msg=N'Your package execution did not succeed for execution ID: ' + CAST(@exe_id AS NVARCHAR(20)) RAISERROR(@err_msg,15,1) END
      

      Azure SQL Database linked service

  6. パイプラインの構成を検証するために、ツール バーの [検証] をクリックします。 [Pipeline Validation Report](パイプライン検証レポート) を閉じるには、>> をクリックします。

    Validate pipeline

  7. [Publish All](すべて発行) ボタンをクリックして、データ ファクトリにパイプラインを発行します。

    Publish

パイプラインを実行して監視する

このセクションでは、パイプラインの実行をトリガーして監視します。

  1. パイプラインの実行をトリガーするために、ツール バーの [トリガー] をクリックし、 [Trigger Now](今すぐトリガー) をクリックします。

    Trigger now

  2. [Pipeline Run](パイプラインの実行) ウィンドウで [完了] を選択します。

  3. 左側で [監視] タブに切り替えます。 パイプラインの実行とその状態が、その他の情報 (実行開始時刻など) と共に表示されます。 ビューを更新するには、 [Refresh](最新の情報に更新) をクリックします。

    Screenshot that shows pipeline runs

  4. [アクション] 列の [View Activity Runs](アクティビティの実行の表示) リンクをクリックします。 パイプラインに 1 つしかアクティビティ (ストアド プロシージャ アクティビティ) がないので、アクティビティの実行が 1 つだけ表示されます。

    Screenshot that shows activity runs

  5. 次のクエリを SQL データベースの SSISDB データベースに対して実行すると、パッケージが実行されたことを確認できます。

    select * from catalog.executions
    

    Verify package executions

Note

また、パイプラインがスケジュール上で実行されるように (時間単位、日次など)、お使いのパイプラインのスケジュールされたトリガーを作成します。 例については、「Create a data factory - Data Factory UI」 (データ ファクトリの作成 - データ ファクトリ UI ) リンクをご確認ください。

Azure PowerShell

注意

Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、Azure PowerShell のインストールに関する記事を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

このセクションでは、Azure PowerShell を使用して、SSIS パッケージを呼び出すストアド プロシージャ アクティビティを含む Data Factory パイプラインを作成します。

Azure PowerShell のインストールと構成の方法に関するページの手順に従って、最新の Azure PowerShell モジュールをインストールしてください。

Data Factory の作成

Azure-SSIS IR と同じデータ ファクトリを使用することも、別のデータ ファクトリを作成することもできます。 次の手順では、データ ファクトリを作成する方法を説明します。 このデータ ファクトリにストアド プロシージャ アクティビティを含むパイプラインを作成します。 ストアド プロシージャ アクティビティが SSISDB データベース内でストアド プロシージャを実行して、SSIS パッケージを実行します。

  1. 後で PowerShell コマンドで使用できるように、リソース グループ名の変数を定義します。 次のコマンド テキストを PowerShell にコピーし、Azure リソース グループの名前を二重引用符で囲んで指定し、コマンドを実行します。 (例: "adfrg")。

    $resourceGroupName = "ADFTutorialResourceGroup";
    

    リソース グループが既に存在する場合、上書きしないようお勧めします。 $ResourceGroupName 変数に別の値を割り当てて、コマンドをもう一度実行します。

  2. Azure リソース グループを作成するには、次のコマンドを実行します。

    $ResGrp = New-AzResourceGroup $resourceGroupName -location 'eastus'
    

    リソース グループが既に存在する場合、上書きしないようお勧めします。 $ResourceGroupName 変数に別の値を割り当てて、コマンドをもう一度実行します。

  3. データ ファクトリ名の変数を定義します。

    重要

    データ ファクトリ名は、グローバルに一意となるように更新してください。

    $DataFactoryName = "ADFTutorialFactory";
    
  4. データ ファクトリを作成するには、$ResGrp 変数の Location および ResourceGroupName プロパティを使用して、次の Set-AzDataFactoryV2 コマンドレットを実行します。

    $DataFactory = Set-AzDataFactoryV2 -ResourceGroupName $ResGrp.ResourceGroupName -Location $ResGrp.Location -Name $dataFactoryName 
    

以下の点に注意してください。

  • Azure Data Factory の名前はグローバルに一意にする必要があります。 次のエラーが発生した場合は、名前を変更してからもう一度実行してください。

    The specified Data Factory name 'ADFv2QuickStartDataFactory' is already in use. Data Factory names must be globally unique.
    
  • Data Factory インスタンスを作成するには、Azure へのログインに使用するユーザー アカウントが、共同作成者ロールまたは所有者ロールのメンバーであるか、Azure サブスクリプションの管理者である必要があります。

  • 現在 Data Factory が利用できる Azure リージョンの一覧については、次のページで目的のリージョンを選択し、 [分析] を展開して [Data Factory] を探してください。リージョン別の利用可能な製品 データ ファクトリで使用するデータ ストア (Azure Storage、Azure SQL Database など) やコンピューティング (HDInsight など) は他のリージョンに配置できます。

Azure SQL Database のリンクされたサービスを作成する

リンクされたサービスを作成して、SSIS カタログをホストするデータベースをデータ ファクトリにリンクします。 このリンクされたサービスの情報をデータ ファクトリが使用して、SSISDB データベースに接続し、ストアド プロシージャを実行して SSIS パッケージを実行します。

  1. 次の内容を記述した AzureSqlDatabaseLinkedService.json という名前の JSON ファイルを C:\ADF\RunSSISPackage フォルダーに作成します。

    重要

    <servername>、<username>、<password> を実際の Azure SQL データベースの値に置き換えてから、ファイルを保存してください。

    {
        "name": "AzureSqlDatabaseLinkedService",
        "properties": {
            "type": "AzureSqlDatabase",
            "typeProperties": {
                "connectionString": "Server=tcp:<servername>.database.windows.net,1433;Database=SSISDB;User ID=<username>;Password=<password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30"
            }
        }
    }
    
  2. Azure PowerShellC:\ADF\RunSSISPackage フォルダーに切り替えます。

  3. Set-AzDataFactoryV2LinkedService コマンドレットを実行して、リンクされたサービス AzureSqlDatabaseLinkedService を作成します。

    Set-AzDataFactoryV2LinkedService -DataFactoryName $DataFactory.DataFactoryName -ResourceGroupName $ResGrp.ResourceGroupName -Name "AzureSqlDatabaseLinkedService" -File ".\AzureSqlDatabaseLinkedService.json"
    

ストアド プロシージャ アクティビティを含むパイプラインを作成する

この手順では、ストアド プロシージャ アクティビティを含むパイプラインを作成します。 このアクティビティは、SSIS パッケージを実行する sp_executesql ストアド プロシージャを呼び出します。

  1. 次の内容を記述した RunSSISPackagePipeline.json という名前の JSON ファイルを C:\ADF\RunSSISPackage フォルダーに作成します。

    重要

    <FOLDER NAME>、<PROJECT NAME>、<PACKAGE NAME> を、SSIS カタログのフォルダー、プロジェクト、パッケージの名前で置き換えてから、ファイルを保存してください。

    {
        "name": "RunSSISPackagePipeline",
        "properties": {
            "activities": [
                {
                    "name": "My SProc Activity",
                    "description":"Runs an SSIS package",
                    "type": "SqlServerStoredProcedure",
                    "linkedServiceName": {
                        "referenceName": "AzureSqlDatabaseLinkedService",
                        "type": "LinkedServiceReference"
                    },
                    "typeProperties": {
                        "storedProcedureName": "sp_executesql",
                        "storedProcedureParameters": {
                            "stmt": {
                                "value": "DECLARE @return_value INT, @exe_id BIGINT, @err_msg NVARCHAR(150)    EXEC @return_value=[SSISDB].[catalog].[create_execution] @folder_name=N'<FOLDER NAME>', @project_name=N'<PROJECT NAME>', @package_name=N'<PACKAGE NAME>', @use32bitruntime=0, @runinscaleout=1, @useanyworker=1, @execution_id=@exe_id OUTPUT    EXEC [SSISDB].[catalog].[set_execution_parameter_value] @exe_id, @object_type=50, @parameter_name=N'SYNCHRONIZED', @parameter_value=1    EXEC [SSISDB].[catalog].[start_execution] @execution_id=@exe_id, @retry_count=0    IF(SELECT [status] FROM [SSISDB].[catalog].[executions] WHERE execution_id=@exe_id)<>7 BEGIN SET @err_msg=N'Your package execution did not succeed for execution ID: ' + CAST(@exe_id AS NVARCHAR(20)) RAISERROR(@err_msg,15,1) END"
                            }
                        }
                    }
                }
            ]
        }
    }
    
  2. パイプライン RunSSISPackagePipeline を作成するには、Set-AzDataFactoryV2Pipeline コマンドレットを実行します。

    $DFPipeLine = Set-AzDataFactoryV2Pipeline -DataFactoryName $DataFactory.DataFactoryName -ResourceGroupName $ResGrp.ResourceGroupName -Name "RunSSISPackagePipeline" -DefinitionFile ".\RunSSISPackagePipeline.json"
    

    出力例を次に示します。

    PipelineName      : Adfv2QuickStartPipeline
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    Activities        : {CopyFromBlobToBlob}
    Parameters        : {[inputPath, Microsoft.Azure.Management.DataFactory.Models.ParameterSpecification], [outputPath, Microsoft.Azure.Management.DataFactory.Models.ParameterSpecification]}
    

パイプラインの実行を作成する

Invoke-AzDataFactoryV2Pipeline コマンドレットを使ってパイプラインを実行します。 コマンドレットは、将来の監視のために、パイプラインの実行 ID を返します。

$RunId = Invoke-AzDataFactoryV2Pipeline -DataFactoryName $DataFactory.DataFactoryName -ResourceGroupName $ResGrp.ResourceGroupName -PipelineName $DFPipeLine.Name

パイプラインの実行を監視します

次の PowerShell スクリプトを実行し、データのコピーが完了するまで、パイプラインの実行の状態を継続的にチェックします。 次のスクリプトをコピーして PowerShell ウィンドウに貼り付け、Enter キーを押します。

while ($True) {
    $Run = Get-AzDataFactoryV2PipelineRun -ResourceGroupName $ResGrp.ResourceGroupName -DataFactoryName $DataFactory.DataFactoryName -PipelineRunId $RunId

    if ($Run) {
        if ($run.Status -ne 'InProgress') {
            Write-Output ("Pipeline run finished. The status is: " +  $Run.Status)
            $Run
            break
        }
        Write-Output  "Pipeline is running...status: InProgress"
    }

    Start-Sleep -Seconds 10
}   

トリガーを作成する

前の手順ではオンデマンドでパイプラインを呼び出しました。 スケジュール トリガーを作成して、スケジュール (毎時、毎日など) によってパイプラインをトリガーすることもできます。

  1. 以下の内容を記述した MyTrigger.json という名前の JSON ファイルを C:\ADF\RunSSISPackage フォルダー内に作成します。

    {
        "properties": {
            "name": "MyTrigger",
            "type": "ScheduleTrigger",
            "typeProperties": {
                "recurrence": {
                    "frequency": "Hour",
                    "interval": 1,
                    "startTime": "2017-12-07T00:00:00-08:00",
                    "endTime": "2017-12-08T00:00:00-08:00"
                }
            },
            "pipelines": [{
                    "pipelineReference": {
                        "type": "PipelineReference",
                        "referenceName": "RunSSISPackagePipeline"
                    },
                    "parameters": {}
                }
            ]
        }
    }    
    
  2. Azure PowerShellC:\ADF\RunSSISPackage フォルダーに切り替えます。

  3. Set-AzDataFactoryV2Trigger コマンドレットを実行してトリガーを作成します。

    Set-AzDataFactoryV2Trigger -ResourceGroupName $ResGrp.ResourceGroupName -DataFactoryName $DataFactory.DataFactoryName -Name "MyTrigger" -DefinitionFile ".\MyTrigger.json"
    
  4. 既定ではトリガーは停止状態になっています。 Start-AzDataFactoryV2Trigger コマンドレットを使用してトリガーを起動します。

    Start-AzDataFactoryV2Trigger -ResourceGroupName $ResGrp.ResourceGroupName -DataFactoryName $DataFactory.DataFactoryName -Name "MyTrigger" 
    
  5. Start-AzDataFactoryV2Trigger コマンドレットを実行して、トリガーが起動されていることを確認します。

    Get-AzDataFactoryV2Trigger -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name "MyTrigger"     
    
  6. 時刻の時間部分が次の時間になってから、次のコマンドを実行します。 たとえば、現在時刻が午後 3 時 25 分 (UTC) であれば、午後 4 時 (UTC) にコマンドを実行します。

    Get-AzDataFactoryV2TriggerRun -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -TriggerName "MyTrigger" -TriggerRunStartedAfter "2017-12-06" -TriggerRunStartedBefore "2017-12-09"
    

    次のクエリを SQL データベースの SSISDB データベースに対して実行すると、パッケージが実行されたことを確認できます。

    select * from catalog.executions
    

Azure Portal を使用してパイプラインを監視することもできます。 具体的な手順については、「パイプラインの監視」を参照してください。