Bakgrund
2012 SSIS Project Deployment Model i Visual Studio innehåller en fil för projektparametrar, anslutningshanterare på projektnivå, paket och allt annat du har lagt till i projektet.
På följande bild kan du se att jag har en lösning som heter Lifecycle. Den lösningen har ett projekt som heter Lifecycle. Livscykelprojektet har en anslutningshanterare på projektnivå ERIADOR
definierade och två SSIS-paket:Package00.dtsx och Package01.dtsx.
När du kör ett paket kommer Visual Studio bakom kulisserna först att bygga/kompilera alla nödvändiga projektelement till ett distribuerbart kvantum som kallas en ispac (uttalas eye-ess-pack, inte ice-pack). Detta kommer att hittas i bin\Development
undermapp för ditt projekt.
Lifecycle.ispac är en zip-fil med följande innehåll.
Vad betyder allt detta? Den största skillnaden är att istället för att bara distribuera ett uppdaterat paket, måste du distribuera hela .ispac. Ja, du måste verkligen distribuera om allt trots att du bara ändrat ett paket. Så är livet.
Hur distribuerar jag paket med SSIS Project Deployment-modellen?
Du har ett värdalternativ tillgängligt för dig, men de tre sakerna du behöver veta är
- var är min ispac
- vilken server distribuerar jag till
- vilken mapp gör detta projekt till
SSDT
Detta kommer förmodligen att vara ditt vanligaste alternativ i början. Inom SQL Server Data Tools, SSDT, har du möjlighet att definiera på Configuration Manager-nivå vilken server och vilken mapp saker distribueras till. Hos min klient har jag 3 konfigurationer:Dev, Stage, Production. När du väl definierat dessa värden sparas de i .dtproj-filen och du kan sedan högerklicka och distribuera till ditt hjärta från Visual Studio.
ISDeploymentWizard - GUI-smak
SSDT bygger egentligen bara anropet till ISDeploymentWizard.exe som kommer i 32 och 64 bitars varianter av någon anledning.
- C:\Program Files\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
- C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
En .ispac-tillägg är kopplad till ISDeploymentWizard så dubbelklicka och du är iväg. Den första skärmen är ny jämfört med att använda SSDT-gränssnittet, men efter det kommer det att vara samma uppsättning klick att distribuera.
ISDeploymentWizard - kommandoradssmak
Vad de fick rätt med 2012 års release som suger med paketdistributionsmodellen var att manifestfilen kan distribueras på ett automatiserat sätt. Jag hade en lösning men det borde ha varit en standard "grej".
Så titta noga på granskningsfliken från antingen SSDT- eller GUI-installationen. Är inte det en skönhet?
Genom att använda samma körbara, ISDeploymentWizard, kan vi ha både ett bemannat och obevakat installationsprogram för våra .ispac(s). Markera den andra raden där, kopiera klistra in och nu kan du ha kontinuerlig integration!
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
Du kan distribuera en ispac till SQL Server via SQL Server Management Studio, SSMS eller genom kommandoraden sqlcmd.exe. Medan SQLCMD är inte strikt obligatoriskt, det förenklar skriptet.
Du måste använd ett Windows-konto för att utföra den här operationen men annars får du följande felmeddelande.
Dessutom behöver du förmågan att utföra bulkoperationer (för att serialisera .ispac) och ssis_admin/sa-rättigheter till SSISDB-databasen.
Här använder vi OPENROWSET med alternativet BULK för att läsa ispac till en varbinär variabel. Vi skapar en mapp via catalog.create_folder om det inte redan finns och sedan implementera projektet med catalog.deploy_project . När det är klart vill jag kolla i operationsmeddelandetabellen för att verifiera att det gick som förväntat.
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;
Din MAMMA
Som i, din Managed Object Model tillhandahåller ett .NET-gränssnitt för att distribuera paket. Detta är en PowerShell-metod för att distribuera en ispac tillsammans med att skapa mappen eftersom det är ett alternativ som ISDeploymentWizard inte stöder.
[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