Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment déployer un package SSIS existant dans sql server 2012 ?

Contexte

Le Modèle de déploiement de projet SSIS 2012 dans Visual Studio contient un fichier pour les paramètres du projet, les gestionnaires de connexion au niveau du projet, les packages et tout ce que vous avez ajouté au projet.

Dans l'image suivante, vous pouvez voir que j'ai une solution nommée Lifecycle. Cette solution a un projet nommé Lifecycle. Le projet Lifecycle a un gestionnaire de connexion au niveau du projet ERIADOR défini et deux packages SSIS :Package00.dtsx et Package01.dtsx.

Lorsque vous exécutez un package, dans les coulisses, Visual Studio construit/compile d'abord tous les éléments de projet requis dans un quantum déployable appelé ispac (prononcé eye-ess-pack, pas ice-pack). Cela se trouvera dans le bin\Development sous-dossier de votre projet.

Lifecycle.ispac est un fichier zip avec le contenu suivant.

Qu'est-ce que tout cela signifie? La plus grande différence est qu'au lieu de simplement déployer un package mis à jour, vous devrez déployer l'intégralité du fichier .ispac. Oui, vous devez vraiment tout redéployer même si vous n'avez modifié qu'un seul package. Ainsi va la vie.

Comment déployer des packages à l'aide du modèle de déploiement de projet SSIS ?

Vous disposez d'options d'hébergement, mais les 3 choses que vous devez savoir sont

  • où est mon ispac
  • sur quel serveur suis-je en train de déployer
  • dans quel dossier ce projet porte-t-il

SSDT

Ce sera probablement votre option la plus courante au début. Dans SQL Server Data Tools, SSDT, vous avez la possibilité de définir au niveau du gestionnaire de configuration sur quel serveur et dans quel dossier les éléments sont déployés. Chez mon client, j'ai 3 configurations :Dev, Stage, Production. Une fois que vous avez défini ces valeurs, elles sont enregistrées dans le fichier .dtproj et vous pouvez ensuite cliquer avec le bouton droit de la souris et les déployer à votre guise depuis visual studio.

ISDeploymentWizard - Type d'interface graphique

SSDT est en train de créer l'appel à ISDeploymentWizard.exe qui est disponible en versions 32 et 64 bits pour une raison quelconque.

  • C:\Program Files\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
  • C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe

Une extension .ispac est associée à ISDeploymentWizard donc double-cliquez et c'est parti. Le premier écran est nouveau par rapport à l'utilisation de l'interface SSDT, mais après cela, ce sera le même ensemble de clics à déployer.

ISDeploymentWizard - type de ligne de commande

Ce qu'ils ont bien compris avec la version 2012 qui a été nulle avec le modèle de déploiement de packages, c'est que le fichier manifeste peut être déployé de manière automatisée. J'avais une solution de contournement mais cela aurait dû être une "chose" standard.

Examinez donc attentivement l'onglet Review du déploiement SSDT ou GUI. N'est-ce pas une beauté ?

En utilisant le même exécutable, ISDeploymentWizard, nous pouvons avoir à la fois un programme d'installation assisté et non assisté pour nos .ispac (s). Mettez en surbrillance la deuxième ligne, copiez-collez et vous pouvez maintenant avoir une intégration continue !

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

Vous pouvez déployer un ispac sur SQL Server via SQL Server Management Studio, SSMS ou via la ligne de commande, sqlcmd.exe. Tandis que SQLCMD n'est pas strictement nécessaire, cela simplifie le script.

Vous devez utilisez un compte Windows pour effectuer cette opération, sinon vous recevrez le message d'erreur suivant.

De plus, vous aurez besoin de la possibilité d'effectuer des opérations en masse (pour sérialiser le .ispac) et des droits ssis_admin/sa sur la base de données SSISDB.

Ici, nous utilisons OPENROWSET avec l'option BULK pour lire l'ispac dans une variable varbinary. Nous créons un dossier via catalog.create_folder s'il n'existe pas déjà, puis déployez réellement le projet avec catalog.deploy_project . Une fois cela fait, j'aime vérifier le tableau des messages d'opérations pour vérifier que tout s'est passé comme prévu.

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;

Votre maman

Comme dans, votre Modèle d'objet géré fournit une interface .NET pour le déploiement de packages. Il s'agit d'une approche PowerShell pour déployer un ispac avec la création du dossier, car il s'agit d'une option que ISDeploymentWizard ne prend pas en charge.

[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