Antecedentes
El modelo de implementación de proyectos SSIS de 2012 en Visual Studio contiene un archivo para los parámetros del proyecto, administradores de conexión a nivel de proyecto, paquetes y cualquier otra cosa que haya agregado al proyecto.
En la siguiente imagen, puede ver que tengo una solución llamada Lifecycle. Esa solución tiene un proyecto llamado Lifecycle. El proyecto Lifecycle tiene un Project Level Connection Manager ERIADOR
definido y dos paquetes SSIS:Package00.dtsx y Package01.dtsx.
Cuando ejecuta un paquete, entre bastidores, Visual Studio primero compilará/compilará todos los elementos necesarios del proyecto en un cuanto desplegable llamado ispac (pronunciado eye-ess-pack, no ice-pack). Esto se encontrará en el bin\Development
subcarpeta para su proyecto.
Lifecycle.ispac es un archivo zip con los siguientes contenidos.
¿Qué significa todo esto? La mayor diferencia es que, en lugar de solo implementar un paquete actualizado, deberá implementar todo el .ispac. Sí, realmente tiene que volver a implementar todo aunque solo haya cambiado un paquete. Así es la vida.
¿Cómo implemento paquetes usando el modelo de implementación de proyectos de SSIS?
Tiene opciones de host disponibles para usted, pero las 3 cosas que debe saber son
- dónde está mi ispac
- en qué servidor estoy implementando
- a qué carpeta pertenece este proyecto
SSDT
Esta será probablemente su opción más común al principio. Dentro de SQL Server Data Tools, SSDT, tiene la capacidad de definir en el nivel del Administrador de configuración en qué servidor y en qué carpeta se implementan las cosas. En mi cliente, tengo 3 configuraciones:Dev, Stage, Production. Una vez que define esos valores, se guardan en el archivo .dtproj y luego puede hacer clic con el botón derecho e implementar el contenido de su corazón desde Visual Studio.
ISDeploymentWizard:versión de GUI
SSDT realmente solo crea la llamada a ISDeploymentWizard.exe que viene en versiones de 32 y 64 bits por alguna razón.
- C:\Archivos de programa\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
- C:\Archivos de programa (x86)\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
Una extensión .ispac está asociada a ISDeploymentWizard, así que haga doble clic y listo. La primera pantalla es nueva en comparación con el uso de la interfaz SSDT, pero después de eso, será el mismo conjunto de clics para implementar.
ISDeploymentWizard - tipo de línea de comando
Lo que acertaron con la versión de 2012 que apestaba con el modelo de implementación de paquetes fue que el archivo de manifiesto se puede implementar de forma automatizada. Tuve una solución alternativa pero debería haber sido una "cosa" estándar.
Por lo tanto, mire detenidamente la pestaña Revisar desde la implementación de SSDT o GUI. ¿No es una belleza?
Usando el mismo ejecutable, ISDeploymentWizard, podemos tener un instalador atendido y desatendido para nuestros .ispac(s). Resalte la segunda línea allí, copie y pegue y ahora puede tener una integración 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
Puede implementar un ispac en SQL Server a través de SQL Server Management Studio, SSMS o mediante la línea de comandos, sqlcmd.exe. Mientras SQLCMD no es estrictamente necesario, simplifica el script.
debes use una cuenta de Windows para realizar esta operación; de lo contrario, recibirá el siguiente mensaje de error.
Además, necesitará la capacidad de realizar operaciones masivas (para serializar el .ispac) y derechos ssis_admin/sa para la base de datos SSISDB.
Aquí usamos OPENROWSET con la opción BULK para leer el ispac en una variable varbinary. Creamos una carpeta a través de catalog.create_folder si aún no existe y luego implementar el proyecto con catalog.deploy_project . Una vez hecho esto, me gusta revisar la tabla de mensajes de operaciones para verificar que todo salió como se esperaba.
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;
Tu MAMÁ
Como en, su Modelo de objetos gestionados proporciona una interfaz .NET para implementar paquetes. Este es un enfoque de PowerShell para implementar un ispac junto con la creación de la carpeta, ya que es una opción que ISDeploymentWizard no admite.
[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