背景
2012 SSIS プロジェクト配置モデル Visual Studio の には、プロジェクト パラメーター、プロジェクト レベルの接続マネージャー、パッケージ、およびプロジェクトに追加したその他すべてのファイルが含まれています。
次の図では、Lifecycle という名前のソリューションがあることがわかります。そのソリューションには、Lifecycle という名前のプロジェクトがあります。ライフサイクル プロジェクトには、プロジェクト レベルの接続マネージャー ERIADOR
があります。 定義済みおよび 2 つの SSIS パッケージ (Package00.dtsx および Package01.dtsx)。
パッケージを実行すると、Visual Studio は最初に必要なすべてのプロジェクト要素を ispac (ice-pack ではなく eye-ess-pack と発音します) と呼ばれる展開可能なクォンタムにビルド/コンパイルします。これは bin\Development
にあります プロジェクトのサブフォルダー。
Lifecycle.ispac は、次の内容の zip ファイルです。
これはどういう意味ですか?最大の違いは、更新されたパッケージを展開するだけでなく、.ispac 全体を展開する必要があることです。はい、パッケージを 1 つだけ変更した場合でも、すべてを再デプロイする必要があります。それが人生です。
SSIS プロジェクト配置モデルを使用してパッケージを配置するにはどうすればよいですか?
利用可能なホスト オプションがありますが、知っておく必要がある 3 つのことは
- ispac はどこですか
- デプロイ先のサーバー
- このプロジェクトの対象フォルダ
SSDT
これは、最初はおそらく最も一般的なオプションです。 SQL Server Data Tools (SSDT) 内では、Configuration Manager レベルで、どのサーバーとどのフォルダーにデプロイするかを定義できます。私のクライアントには、開発、ステージ、本番の 3 つの構成があります。これらの値を定義すると、それらは .dtproj ファイルに保存され、右クリックして Visual Studio から心ゆくまで展開できます。
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
ISDeploymentWizard には .ispac 拡張子が関連付けられているため、ダブルクリックするだけですぐに使用できます。最初の画面は SSDT インターフェースを使用する場合と比べて新しいですが、その後は同じ一連のクリックでデプロイできます。
ISDeploymentWizard - コマンドライン風
2012 リリースでうまくいったのは、パッケージ展開モデルがうまくいかなかったことで、マニフェスト ファイルを自動化された方法で展開できるということでした。 回避策 がありました しかし、それは標準的な「もの」であるべきでした.
そのため、SSDT または GUI デプロイの [レビュー] タブを注意深く見てください。それは美しさではありませんか?
同じ実行可能ファイル 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 厳密には必須ではありませんが、スクリプトを簡素化します。
しなければならない 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;
お母さん
のように、あなたの マネージド オブジェクト モデル パッケージを展開するための .NET インターフェイスを提供します。これは、ISDeploymentWizard がサポートしていないオプションであるため、フォルダーの作成と共に ispac をデプロイするための PowerShell アプローチです。
[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