sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo implementar un paquete SSIS existente en el servidor sql 2012?

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