Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come distribuire un pacchetto SSIS esistente in SQL Server 2012?

Sfondo

Il Modello di distribuzione del progetto SSIS 2012 in Visual Studio contiene un file per i parametri del progetto, i gestori di connessione a livello di progetto, i pacchetti e qualsiasi altra cosa che hai aggiunto al progetto.

Nella figura seguente, puoi vedere che ho una soluzione denominata Lifecycle. Quella soluzione ha un progetto chiamato Lifecycle. Il progetto Lifecycle ha un Connection Manager a livello di progetto ERIADOR definito e due pacchetti SSIS:Package00.dtsx e Package01.dtsx.

Quando si esegue un pacchetto, dietro le quinte Visual Studio compila/compila prima tutti gli elementi del progetto necessari in un quantum distribuibile chiamato ispac (pronunciato eye-ess-pack, non ice-pack). Questo si troverà in bin\Development sottocartella per il tuo progetto.

Lifecycle.ispac è un file zip con i seguenti contenuti.

Cosa significa tutto questo? La differenza più grande è che invece di distribuire semplicemente un pacchetto aggiornato, dovrai distribuire l'intero .ispac. Sì, devi davvero ridistribuire tutto anche se hai cambiato solo un pacchetto. Così è la vita.

Come si distribuiscono i pacchetti utilizzando il modello di distribuzione del progetto SSIS?

Hai un'opzione host a tua disposizione, ma le 3 cose che devi sapere sono

  • dov'è il mio ispac
  • su quale server sto effettuando la distribuzione
  • in quale cartella viene indirizzato questo progetto

SSDT

Questa sarà probabilmente la tua opzione più comune all'inizio. All'interno di SQL Server Data Tools, SSDT, hai la possibilità di definire a livello di Configuration Manager in quale server e in quale cartella vengono distribuiti gli elementi. Al mio cliente ho 3 configurazioni:Dev, Stage, Production. Una volta definiti questi valori, vengono salvati nel file .dtproj e puoi quindi fare clic con il pulsante destro del mouse e distribuirli a tuo piacimento da Visual Studio.

ISDeploymentWizard - Versione GUI

SSDT in realtà sta solo costruendo la chiamata a ISDeploymentWizard.exe, disponibile nelle versioni a 32 e 64 bit per qualche motivo.

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

Un'estensione .ispac è associata a ISDeploymentWizard, quindi fai doppio clic e il gioco è fatto. La prima schermata è nuova rispetto all'utilizzo dell'interfaccia SSDT, ma in seguito sarà lo stesso set di clic da distribuire.

ISDeploymentWizard - versione della riga di comando

Quello che hanno ottenuto con la versione 2012 che ha risucchiato con il modello di distribuzione del pacchetto è che il file manifest può essere distribuito in modo automatizzato. Avevo una soluzione alternativa ma avrebbe dovuto essere una "cosa" standard

Quindi guarda attentamente la scheda Revisione dalla distribuzione SSDT o GUI. Non è una bellezza?

Utilizzando lo stesso eseguibile, ISDeploymentWizard, possiamo avere sia un programma di installazione presidiato che automatico per i nostri .ispac. Evidenzia la seconda riga lì, copia incolla e ora puoi avere un'integrazione 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

È possibile distribuire un ispac in SQL Server tramite SQL Server Management Studio, SSMS o tramite la riga di comando, sqlcmd.exe. Mentre SQLCMD non è strettamente richiesto, semplifica lo script.

devi usa un account Windows per eseguire questa operazione, altrimenti riceverai il seguente messaggio di errore.

Inoltre, avrai bisogno della capacità di eseguire operazioni in blocco (per serializzare il file .ispac) e dei diritti ssis_admin/sa sul database SSISDB.

Qui usiamo OPENROWSET con l'opzione BULK per leggere l'ispac in una variabile varbinary. Creiamo una cartella tramite catalog.create_folder se non esiste già e quindi distribuire effettivamente il progetto con catalog.deploy_project . Una volta terminato, mi piace controllare la tabella dei messaggi operativi per verificare che le cose siano andate come previsto.

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;

Tua mamma

Come in, il tuo Modello a oggetti gestito fornisce un'interfaccia .NET per la distribuzione dei pacchetti. Questo è un approccio di PowerShell per la distribuzione di un ispac insieme alla creazione della cartella poiché è un'opzione che ISDeploymentWizard non supporta.

[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