web-dev-qa-db-ja.com

SQL Server 2012に既存のSSISパッケージを展開する方法は?

SSISパッケージに取り組んでいます。既存のssisパッケージにもう1つのデータフロータスクを追加しました。新しいタスクの追加が完了した後、パッケージを再構築し、エラーなしで成功しました。開発サーバーに展開する必要がありますか?

16
user3203331

バックグラウンド

Visual Studioの 2012 SSISプロジェクト配置モデル には、プロジェクトパラメーター、プロジェクトレベルの接続マネージャー、パッケージ、およびプロジェクトに追加したその他のファイルが含まれています。

次の図では、Lifecycleという名前のソリューションがあることがわかります。このソリューションには、Lifecycleという名前のプロジェクトがあります。ライフサイクルプロジェクトには、プロジェクトレベル接続マネージャーERIADORが定義されており、2つのSSISパッケージ:Package00.dtsxとPackage01.dtsxがあります。

Solution to project to file relationship

パッケージを実行すると、舞台裏でVisual Studioはまず、必要なすべてのプロジェクト要素をispac(ice-packではなくeye-ess-packと発音)と呼ばれる展開可能なクォンタムにビルド/コンパイルします。これはbin\Developmentプロジェクトのサブフォルダー。

Lifecycle.ispac

Lifecycle.ispacは、次の内容を含むZipファイルです。

Exploded ispac

これはどういう意味ですか?最大の違いは、更新されたパッケージを展開するだけでなく、.ispac全体を展開する必要があることです。はい、1つのパッケージのみを変更した場合でも、本当にすべてを再デプロイする必要があります。それが人生だ。

SSISプロジェクト展開モデルを使用してパッケージを展開するにはどうすればよいですか?

ホストオプションを利用できますが、知っておく必要がある3つのことは

  • 私のispacはどこですか
  • どのサーバーにデプロイしていますか
  • このプロジェクトの対象フォルダ

SSDT

これはおそらく最初に最も一般的なオプションです。 SQL Server Data Tools(SSDT)内では、Configuration Managerレベルで、どのサーバーとどのフォルダーにデプロイするかを定義できます。私のクライアントには、開発、ステージ、本番の3つの構成があります。これらの値を定義すると、それらは.dtprojファイルに保存されます。その後、Visual Studioから右クリックして心のコンテンツに展開できます。

enter image description here

ISDeploymentWizard-GUIフレーバー

SSDTは、何らかの理由で32ビットと64ビットのフレーバーが付属するISDeploymentWizard.exeの呼び出しを実際に構築しているだけです。

  • C:\ Program Files\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
  • C:\ Program Files(x86)\ Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe

.ispac拡張子はISDeploymentWizardに関連付けられているため、ダブルクリックしてすぐに移動できます。最初の画面は、SSDTインターフェイスを使用した場合と比べて新しいものですが、その後、展開するのと同じ一連のクリックになります。

ISDeploymentWizard-コマンドラインフレーバー

パッケージ展開モデルでひどい2012リリースで彼らが得たものは、マニフェストファイルを自動化された方法で展開できることです。 回避策 がありましたが、それは標準の「もの」であるべきでした。

そのため、SSDTまたはGUIデプロイのいずれかの[レビュー]タブを注意深く見てください。それは美しさではありませんか?

Silent install option

同じ実行可能ファイルISDeploymentWizardを使用すると、.ispacの有人インストーラと無人インストーラの両方を使用できます。そこで2行目を強調表示し、コピーして貼り付ければ、継続的な統合が可能になります!

C:\Program Files\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe 
/Silent 
/SourcePath:"C:\Dropbox\presentations\SSISDB Lifecycle\Lifecycle\Lifecycle\bin\Development\Lifecycle.ispac" 
/DestinationServer:"localhost\dev2012" 
/DestinationPath:"/SSISDB/Folder/Lifecycle"

TSQL

SQL Server Management Studio、SSMS、またはコマンドラインsqlcmd.exeを使用して、ispacをSQL Serverに展開できます。 [〜#〜] sqlcmd [〜#〜] は厳密に必須ではありませんが、スクリプトを簡素化します。

あなたはmustこの操作を実行するためにWindowsアカウントを使用する必要がありますが、そうしないと、次のエラーメッセージが表示されます。

SQL Server認証を使用するアカウントでは、操作を開始できません。 Windows認証を使用するアカウントで操作を開始します。

さらに、一括操作(.ispacのシリアル化)およびSSISDBデータベースに対するssis_admin/sa権限を実行する機能が必要です。

ここでは、OPENROWSETとBULKオプションを使用してispacをvarbinary変数に読み取ります。 catalog.create_folder でフォルダーが存在しない場合は作成し、実際に catalog.deploy_project でプロジェクトをデプロイします。完了したら、操作メッセージテーブルをチェックして、期待どおりに処理されたことを確認します。

USE SSISDB
GO

-- You must be in SQLCMD mode
-- setvar isPacPath "C:\Dropbox\presentations\SSISDB Lifecycle\Lifecycle\Lifecycle\bin\Development\Lifecycle.ispac"
:setvar isPacPath "<isPacFilePath, nvarchar(4000), C:\Dropbox\presentations\SSISDB Lifecycle\Lifecycle\Lifecycle\bin\Development\Lifecycle.ispac>"

DECLARE
    @folder_name nvarchar(128) = 'TSQLDeploy'
,   @folder_id bigint = NULL
,   @project_name nvarchar(128) = 'TSQLDeploy'
,   @project_stream varbinary(max)
,   @operation_id bigint = NULL;

-- Read the Zip (ispac) data in from the source file
SELECT
    @project_stream = T.stream
FROM
(
    SELECT 
        *
    FROM 
        OPENROWSET(BULK N'$(isPacPath)', SINGLE_BLOB ) AS B
) AS T (stream);

-- Test for catalog existences
IF NOT EXISTS
(
    SELECT
        CF.name
    FROM
        catalog.folders AS CF
    WHERE
        CF.name = @folder_name
)
BEGIN
    -- Create the folder for our project
    EXECUTE [catalog].[create_folder] 
        @folder_name
    ,   @folder_id OUTPUT;
END

-- Actually deploy the project
EXECUTE [catalog].[deploy_project] 
    @folder_name
,   @project_name
,   @project_stream
,   @operation_id OUTPUT;

-- Check to see if something went awry
SELECT
    OM.* 
FROM
    catalog.operation_messages AS OM
WHERE
    OM.operation_message_id = @operation_id;

あなたのMOM

たとえば、 Managed Object Model は、パッケージを展開するための.NETインターフェイスを提供します。これは、isDeployを展開するためのPowerShellのアプローチであり、ISDeploymentWizardがサポートしていないオプションであるフォルダーの作成も行います。

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Management.IntegrationServices") | Out-Null

#this allows the debug messages to be shown
$DebugPreference = "Continue"

# Retrieves a 2012 Integration Services CatalogFolder object
# Creates one if not found
Function Get-CatalogFolder
{
    param
    (
        [string] $folderName
    ,   [string] $folderDescription
    ,   [string] $serverName = "localhost\dev2012"
    )

    $connectionString = [String]::Format("Data Source={0};Initial Catalog=msdb;Integrated Security=SSPI;", $serverName)

    $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)

    $integrationServices = New-Object Microsoft.SqlServer.Management.IntegrationServices.IntegrationServices($connection)
    # The one, the only SSISDB catalog
    $catalog = $integrationServices.Catalogs["SSISDB"]

    $catalogFolder = $catalog.Folders[$folderName]

    if (-not $catalogFolder)
    {
        Write-Debug([System.string]::Format("Creating folder {0}", $folderName))
        $catalogFolder = New-Object Microsoft.SqlServer.Management.IntegrationServices.CatalogFolder($catalog, $folderName, $folderDescription)
        $catalogFolder.Create()
    }

    return $catalogFolder
}

# Deploy an ispac file into the SSISDB catalog
Function Deploy-Project
{
    param
    (
        [string] $projectPath
    ,   [string] $projectName
    ,   $catalogFolder
    )

    # test to ensure file exists
    if (-not $projectPath -or  -not (Test-Path $projectPath))
    {
        Write-Debug("File not found $projectPath")
        return
    }

    Write-Debug($catalogFolder.Name)
    Write-Debug("Deploying $projectPath")

    # read the data into a byte array
    [byte[]] $projectStream = [System.IO.File]::ReadAllBytes($projectPath)

    # $ProjectName MUST match the value in the .ispac file
    # else you will see 
    # Failed to deploy the project. Fix the problems and try again later.:The specified project name, test, does not match the project name in the deployment file.
    $projectName = "Lifecycle"

    $project = $catalogFolder.DeployProject($projectName, $projectStream)
}




$isPac = "C:\Dropbox\presentations\SSISDB Lifecycle\Lifecycle\Lifecycle\bin\Development\Lifecycle.ispac"
$folderName = "Folder"
$folderName = "SSIS2012"
$folderDescription = "I am a description"
$serverName = "localhost\dev2012"

$catalogFolder = Get-CatalogFolder $folderName $folderDescription $serverName

Deploy-Project $isPac $projectName $catalogFolder
60
billinkc

これは、SSIS 2016での単一パッケージの展開に関する更新です(これが役立つことを願っています)。

SQL Server 2016およびSSDT 2015のリリースにより、単一パッケージの展開の問題は過去のものとなりました。プロジェクト展開モデル内で個々のパッケージを展開するために登場する新しいDeploy Packageオプション(VS 2015)があります

Deploy Package option in VS 2015

この新機能を使用すると、コントロールキー(Ctrl)をクリックして押したまま、展開するパッケージを選択することで、複数のパッケージを展開することもできます。

Visual Studio 2015の[パッケージの展開]オプションの他に、ISDeploymentWizardアプリケーションの起動やコマンドライン展開など、パッケージの展開に使用できる他の可能性がいくつかあります。 (これは、SSISのビルドと展開が継続的インテグレーションプロセスの一部として自動化または管理される場合に必要です)。この記事に移動して詳細を確認できます。 http://www.sqlshack.com/single-package-deployment-in-sql-server-integration-services-2016/

10
LarryB

SSIS 2012でプロジェクトモデルを使用している場合は、パッケージを変更するたびにプロジェクトを展開する必要があります。簡単にできることは:

  • [プロジェクト]をクリックして展開
1
Maverick