Tło
Model wdrażania projektu SSIS 2012 w programie Visual Studio zawiera plik parametrów projektu, menedżerów połączeń na poziomie projektu, pakietów i wszystkiego, co zostało dodane do projektu.
Na poniższym obrazku widać, że mam rozwiązanie o nazwie cykl życia. To rozwiązanie ma projekt o nazwie Lifecycle. Projekt Lifecycle ma Menedżera połączeń na poziomie projektu ERIADOR
zdefiniowane i dwa pakiety SSIS:Package00.dtsx i Package01.dtsx.
Po uruchomieniu pakietu za kulisami program Visual Studio najpierw skompiluje/skompiluje wszystkie wymagane elementy projektu do postaci możliwej do wdrożenia, zwanej ispac (wymawiane eye-ess-pack, a nie ice-pack). Znajdziesz to w bin\Development
podfolder dla twojego projektu.
Lifecycle.ispac to plik zip z następującą zawartością.
Co to wszystko znaczy? Największą różnicą jest to, że zamiast po prostu wdrażać zaktualizowany pakiet, musisz wdrożyć cały .ispac. Tak, naprawdę musisz ponownie wdrożyć wszystko, nawet jeśli zmieniłeś tylko jeden pakiet. Takie jest życie.
Jak wdrażać pakiety przy użyciu modelu wdrażania projektu SSIS?
Masz dostępne opcje hosta, ale 3 rzeczy, które musisz wiedzieć, to
- gdzie jest mój ispac
- na jakim serwerze wdrażam
- do jakiego folderu ma ten projekt
SSDT
Na początku będzie to prawdopodobnie najczęstsza opcja. W programie SQL Server Data Tools, SSDT, masz możliwość zdefiniowania na poziomie Configuration Manager, do jakiego serwera i do jakiego folderu są wdrażane elementy. U mojego klienta mam 3 konfiguracje:Dev, Stage, Production. Gdy zdefiniujesz te wartości, zostaną one zapisane w pliku .dtproj, a następnie możesz kliknąć prawym przyciskiem myszy i wdrożyć z Visual Studio zgodnie z treścią swojego serca.
ISDeploymentWizard – smak GUI
SSDT po prostu buduje wywołanie do ISDeploymentWizard.exe, który z jakiegoś powodu jest dostępny w wersjach 32- i 64-bitowych.
- C:\Program Files\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
- C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
Rozszerzenie .ispac jest powiązane z ISDeploymentWizard, więc kliknij dwukrotnie i gotowe. Pierwszy ekran jest nowy w porównaniu do korzystania z interfejsu SSDT, ale później będzie to ten sam zestaw kliknięć do wdrożenia.
ISDeploymentWizard — smak wiersza poleceń
To, co udało im się uzyskać w wersji 2012, która była beznadziejna z modelem wdrażania pakietów, polegało na tym, że plik manifestu można wdrożyć w sposób zautomatyzowany. Miałem obejście ale powinna to być standardowa "rzecz".
Przyjrzyj się więc uważnie karcie Recenzja we wdrożeniu SSDT lub GUI. Czy to nie piękno?
Używając tego samego pliku wykonywalnego, ISDeploymentWizard, możemy mieć zarówno nadzorowany, jak i nienadzorowany instalator dla naszych plików .ispac. Zaznacz tam drugą linię, skopiuj i wklej, a teraz możesz mieć ciągłą integrację!
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
Program ispac można wdrożyć w programie SQL Server za pomocą programu SQL Server Management Studio, programu SSMS lub wiersza polecenia sqlcmd.exe. Podczas gdy SQLCMD nie jest ściśle wymagane, upraszcza skrypt.
musisz użyj konta Windows, aby wykonać tę operację, w przeciwnym razie otrzymasz następujący komunikat o błędzie.
Ponadto będziesz potrzebować możliwości wykonywania operacji zbiorczych (w celu serializacji pliku .ispac) i uprawnień ssis_admin/sa do bazy danych SSISDB.
Tutaj używamy OPENROWSET z opcją BULK, aby odczytać ispac do zmiennej varbinary. Tworzymy folder za pomocą catalog.create_folder jeśli jeszcze nie istnieje, a następnie wdróż projekt za pomocą catalog.deploy_project . Po zakończeniu lubię sprawdzić tabelę komunikatów operacyjnych, aby sprawdzić, czy wszystko poszło zgodnie z oczekiwaniami.
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;
Twoja mama
Tak jak w, Twój Zarządzany model obiektów udostępnia interfejs .NET do wdrażania pakietów. Jest to podejście PowerShell do wdrażania ispac wraz z tworzeniem folderu, ponieważ jest to opcja, której ISDeploymentWizard nie obsługuje.
[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