Sfondo
Il Modello di distribuzione del progetto SSIS 2012 in Visual Studio contiene un file per i parametri del progetto, i gestori di connessione a livello di progetto, i pacchetti e qualsiasi altra cosa che hai aggiunto al progetto.
Nella figura seguente, puoi vedere che ho una soluzione denominata Lifecycle. Quella soluzione ha un progetto chiamato Lifecycle. Il progetto Lifecycle ha un Connection Manager a livello di progetto ERIADOR
definito e due pacchetti SSIS:Package00.dtsx e Package01.dtsx.
Quando si esegue un pacchetto, dietro le quinte Visual Studio compila/compila prima tutti gli elementi del progetto necessari in un quantum distribuibile chiamato ispac (pronunciato eye-ess-pack, non ice-pack). Questo si troverà in bin\Development
sottocartella per il tuo progetto.
Lifecycle.ispac è un file zip con i seguenti contenuti.
Cosa significa tutto questo? La differenza più grande è che invece di distribuire semplicemente un pacchetto aggiornato, dovrai distribuire l'intero .ispac. Sì, devi davvero ridistribuire tutto anche se hai cambiato solo un pacchetto. Così è la vita.
Come si distribuiscono i pacchetti utilizzando il modello di distribuzione del progetto SSIS?
Hai un'opzione host a tua disposizione, ma le 3 cose che devi sapere sono
- dov'è il mio ispac
- su quale server sto effettuando la distribuzione
- in quale cartella viene indirizzato questo progetto
SSDT
Questa sarà probabilmente la tua opzione più comune all'inizio. All'interno di SQL Server Data Tools, SSDT, hai la possibilità di definire a livello di Configuration Manager in quale server e in quale cartella vengono distribuiti gli elementi. Al mio cliente ho 3 configurazioni:Dev, Stage, Production. Una volta definiti questi valori, vengono salvati nel file .dtproj e puoi quindi fare clic con il pulsante destro del mouse e distribuirli a tuo piacimento da Visual Studio.
ISDeploymentWizard - Versione GUI
SSDT in realtà sta solo costruendo la chiamata a ISDeploymentWizard.exe, disponibile nelle versioni a 32 e 64 bit per qualche motivo.
- C:\Programmi\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
- C:\Programmi (x86)\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
Un'estensione .ispac è associata a ISDeploymentWizard, quindi fai doppio clic e il gioco è fatto. La prima schermata è nuova rispetto all'utilizzo dell'interfaccia SSDT, ma in seguito sarà lo stesso set di clic da distribuire.
ISDeploymentWizard - versione della riga di comando
Quello che hanno ottenuto con la versione 2012 che ha risucchiato con il modello di distribuzione del pacchetto è che il file manifest può essere distribuito in modo automatizzato. Avevo una soluzione alternativa ma avrebbe dovuto essere una "cosa" standard
Quindi guarda attentamente la scheda Revisione dalla distribuzione SSDT o GUI. Non è una bellezza?
Utilizzando lo stesso eseguibile, ISDeploymentWizard, possiamo avere sia un programma di installazione presidiato che automatico per i nostri .ispac. Evidenzia la seconda riga lì, copia incolla e ora puoi avere un'integrazione continua!
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
È possibile distribuire un ispac in SQL Server tramite SQL Server Management Studio, SSMS o tramite la riga di comando, sqlcmd.exe. Mentre SQLCMD non è strettamente richiesto, semplifica lo script.
devi usa un account Windows per eseguire questa operazione, altrimenti riceverai il seguente messaggio di errore.
Inoltre, avrai bisogno della capacità di eseguire operazioni in blocco (per serializzare il file .ispac) e dei diritti ssis_admin/sa sul database SSISDB.
Qui usiamo OPENROWSET con l'opzione BULK per leggere l'ispac in una variabile varbinary. Creiamo una cartella tramite catalog.create_folder se non esiste già e quindi distribuire effettivamente il progetto con catalog.deploy_project . Una volta terminato, mi piace controllare la tabella dei messaggi operativi per verificare che le cose siano andate come previsto.
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;
Tua mamma
Come in, il tuo Modello a oggetti gestito fornisce un'interfaccia .NET per la distribuzione dei pacchetti. Questo è un approccio di PowerShell per la distribuzione di un ispac insieme alla creazione della cartella poiché è un'opzione che ISDeploymentWizard non supporta.
[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