Baggrund
2012 SSIS Project Deployment model i Visual Studio indeholder en fil til projektparametre, forbindelsesadministratorer på projektniveau, pakker og alt andet, du har tilføjet til projektet.
På det følgende billede kan du se, at jeg har en løsning ved navn Lifecycle. Den løsning har et projekt ved navn Lifecycle. Livscyklusprojektet har en forbindelsesleder på projektniveau ERIADOR
defineret og to SSIS-pakker:Package00.dtsx og Package01.dtsx.
Når du kører en pakke, vil Visual Studio bag kulisserne først bygge/kompilere alle de påkrævede projektelementer til et deployerbart kvante, kaldet en ispac (udtales eye-ess-pack, ikke ice-pack). Dette vil blive fundet i bin\Development
undermappe til dit projekt.
Lifecycle.ispac er en zip-fil med følgende indhold.
Hvad betyder alt dette? Den største forskel er, at i stedet for blot at implementere en opdateret pakke, bliver du nødt til at implementere hele .ispac. Ja, du skal virkelig implementere alt, selvom du kun har ændret én pakke. Sådan er livet.
Hvordan implementerer jeg pakker ved hjælp af SSIS Project Deployment-modellen?
Du har en værtsmulighed tilgængelig for dig, men de 3 ting du skal vide er
- hvor er min ispac
- hvilken server installerer jeg til
- hvilken mappe går dette projekt til
SSDT
Dette vil sandsynligvis være din mest almindelige mulighed i starten. Inden for SQL Server Data Tools, SSDT, har du muligheden for at definere på Configuration Manager-niveau, hvilken server og hvilken mappe ting er implementeret til. Hos min klient har jeg 3 konfigurationer:Dev, Stage, Production. Når du har defineret disse værdier, bliver de gemt i .dtproj-filen, og du kan derefter højreklikke og implementere til dit hjertes indhold fra Visual Studio.
ISDeploymentWizard - GUI-smag
SSDT bygger egentlig bare opkaldet til ISDeploymentWizard.exe, som kommer i 32 og 64 bit varianter af en eller anden grund.
- 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-udvidelse er knyttet til ISDeploymentWizard, så dobbeltklik og væk. Den første skærm er ny i forhold til at bruge SSDT-grænsefladen, men derefter vil det være det samme sæt klik at implementere.
ISDeploymentWizard - kommandolinjesmag
Det, de fik ret med 2012-udgivelsen, der sugede med pakkeimplementeringsmodellen, var, at manifestfilen kan implementeres på en automatiseret måde. Jeg havde en løsning men det burde have været en standard "ting".
Så se omhyggeligt på fanen Gennemgang fra enten SSDT- eller GUI-implementeringen. Er det ikke en skønhed?
Ved at bruge den samme eksekverbare, ISDeploymentWizard, kan vi have både et overvåget og uovervåget installationsprogram til vores .ispac(s). Fremhæv den anden linje der, copy paste og nu kan du have 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 implementere en ispac til SQL Server gennem SQL Server Management Studio, SSMS eller gennem kommandolinjen sqlcmd.exe. Mens SQLCMD er ikke strengt påkrævet, det forenkler scriptet.
Du skal brug en Windows-konto til at udføre denne handling, men ellers vil du modtage følgende fejlmeddelelse.
Desuden skal du have mulighed for at udføre masseoperationer (for at serialisere .ispac) og ssis_admin/sa-rettigheder til SSISDB-databasen.
Her bruger vi OPENROWSET med muligheden BULK til at læse ispac'en til en varbinær variabel. Vi opretter en mappe via catalog.create_folder hvis det ikke allerede eksisterer, og implementer derefter projektet med catalog.deploy_project . Når det er gjort, kan jeg godt lide at tjekke tabellen med driftsmeddelelser for at bekræfte, at tingene gik som forventet.
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 MOR
Som i, din Managed Object Model giver en .NET-grænseflade til implementering af pakker. Dette er en PowerShell-tilgang til implementering af en ispac sammen med oprettelse af mappen, da det er en mulighed, ISDeploymentWizard ikke understøtter.
[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