Achtergrond
Het 2012 SSIS-projectimplementatiemodel in Visual Studio bevat een bestand voor projectparameters, verbindingsmanagers op projectniveau, pakketten en al het andere dat u aan het project hebt toegevoegd.
In de volgende afbeelding kunt u zien dat ik een oplossing heb met de naam Lifecycle. Die oplossing heeft een project met de naam Lifecycle. Het Lifecycle-project heeft een Project Level Connection Manager ERIADOR
gedefinieerd en twee SSIS-pakketten:Package00.dtsx en Package01.dtsx.
Wanneer u een pakket uitvoert, zal Visual Studio achter de schermen eerst alle vereiste projectelementen bouwen/compileren in een inzetbaar kwantum dat een ispac wordt genoemd (uitgesproken als eye-ess-pack, niet als ice-pack). Dit is te vinden in de bin\Development
submap voor uw project.
Lifecycle.ispac is een zip-bestand met de volgende inhoud.
Wat betekent dit allemaal? Het grootste verschil is dat u in plaats van alleen een bijgewerkt pakket te implementeren, de hele .ispac moet implementeren. Ja, je moet echt alles opnieuw implementeren, ook al heb je maar één pakket gewijzigd. Zo is het leven.
Hoe implementeer ik pakketten met behulp van het SSIS Project Deployment-model?
Je hebt een host-optie tot je beschikking, maar de 3 dingen die je moet weten zijn
- waar is mijn ispac
- op welke server implementeer ik
- naar welke map gaat dit project
SSDT
Dit zal in het begin waarschijnlijk de meest voorkomende optie zijn. Binnen SQL Server Data Tools, SSDT, heb je de mogelijkheid om op Configuration Manager-niveau te definiëren op welke server en in welke map dingen worden geïmplementeerd. Bij mijn klant heb ik 3 configuraties:Dev, Stage, Production. Zodra u die waarden definieert, worden ze opgeslagen in het .dtproj-bestand en kunt u vervolgens met de rechtermuisknop klikken en naar hartenlust implementeren vanuit Visual Studio.
ISDeploymentWizard - GUI-smaak
SSDT bouwt eigenlijk alleen maar de oproep naar de ISDeploymentWizard.exe die om de een of andere reden in 32- en 64-bits smaken wordt geleverd.
- C:\Program Files\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
- C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
Een .ispac-extensie is gekoppeld aan de ISDeploymentWizard, dus dubbelklikken en wegwezen. Het eerste scherm is nieuw in vergelijking met het gebruik van de SSDT-interface, maar daarna zal het dezelfde set klikken zijn om te implementeren.
ISDeploymentWizard - opdrachtregelaroma
Wat ze goed deden met de release van 2012 die slecht was met het pakketimplementatiemodel, was dat het manifestbestand op een geautomatiseerde manier kan worden geïmplementeerd. Ik had een oplossing maar het had een standaard "ding" moeten zijn.
Kijk dus goed naar het tabblad Review vanuit de SSDT- of GUI-implementatie. Is dat geen schoonheid?
Met hetzelfde uitvoerbare bestand, ISDeploymentWizard, kunnen we zowel een bewaakt als onbeheerd installatieprogramma hebben voor onze .ispac(s). Markeer daar de tweede regel, kopieer en plak en nu kunt u continue integratie hebben!
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
U kunt een ispac naar SQL Server implementeren via SQL Server Management Studio, SSMS of via de opdrachtregel sqlcmd.exe. Terwijl SQLCMD is niet strikt vereist, het vereenvoudigt het script.
Je moet gebruik een Windows-account om deze bewerking uit te voeren, anders krijgt u de volgende foutmelding.
Verder heb je de mogelijkheid nodig om bulkbewerkingen uit te voeren (om de .ispac te serialiseren) en ssis_admin/sa-rechten op de SSISDB-database.
Hier gebruiken we de OPENROWSET met de BULK-optie om de ispac in een varbinaire variabele in te lezen. We maken een map aan via catalog.create_folder als het nog niet bestaat en vervolgens het project daadwerkelijk implementeert met catalog.deploy_project . Als ik klaar ben, controleer ik graag de tabel met bewerkingsberichten om te controleren of alles is gegaan zoals verwacht.
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;
Je MOEDER
Zoals in, uw Managed objectmodel biedt een .NET-interface voor het implementeren van pakketten. Dit is een PowerShell-aanpak voor het implementeren van een ispac samen met het maken van de map, aangezien dat een optie is die de ISDeploymentWizard niet ondersteunt.
[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