Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie stellt man ein vorhandenes SSIS-Paket in SQL Server 2012 bereit?

Hintergrund

Das 2012 SSIS Project Deployment Model in Visual Studio enthält eine Datei für Projektparameter, Verbindungs-Manager auf Projektebene, Pakete und alles andere, was Sie dem Projekt hinzugefügt haben.

Im folgenden Bild sehen Sie, dass ich eine Lösung mit dem Namen Lifecycle habe. Diese Lösung hat ein Projekt namens Lifecycle. Das Lifecycle-Projekt hat einen Project Level Connection Manager ERIADOR definiert und zwei SSIS-Pakete:Package00.dtsx und Package01.dtsx.

Wenn Sie ein Paket ausführen, erstellt/kompiliert Visual Studio hinter den Kulissen zunächst alle erforderlichen Projektelemente in einem bereitstellbaren Quantum namens ispac (ausgesprochen eye-ess-pack, nicht ice-pack). Diese finden Sie im bin\Development Unterordner für Ihr Projekt.

Lifecycle.ispac ist eine ZIP-Datei mit folgendem Inhalt.

Was hat das alles zu bedeuten? Der größte Unterschied besteht darin, dass Sie nicht nur ein aktualisiertes Paket bereitstellen müssen, sondern die gesamte .ispac-Datei bereitstellen müssen. Ja, Sie müssen wirklich alles erneut bereitstellen, obwohl Sie nur ein Paket geändert haben. So ist das Leben.

Wie stelle ich Pakete mit dem SSIS-Projektbereitstellungsmodell bereit?

Ihnen stehen verschiedene Host-Optionen zur Verfügung, aber die 3 Dinge, die Sie wissen müssen, sind

  • wo ist mein ispac
  • auf welchem ​​Server stelle ich bereit?
  • in welchem ​​Ordner befindet sich dieses Projekt

SSDT

Dies wird wahrscheinlich am Anfang Ihre häufigste Option sein. Innerhalb von SQL Server Data Tools, SSDT, haben Sie die Möglichkeit, auf Configuration Manager-Ebene zu definieren, auf welchem ​​Server und in welchem ​​Ordner Dinge bereitgestellt werden. Bei meinem Kunden habe ich 3 Konfigurationen:Dev, Stage, Production. Sobald Sie diese Werte definiert haben, werden sie in der .dtproj-Datei gespeichert und Sie können dann mit der rechten Maustaste klicken und nach Herzenslust von Visual Studio aus bereitstellen.

ISDeploymentWizard - GUI-Variante

SSDT erstellt eigentlich nur den Aufruf der ISDeploymentWizard.exe, die aus irgendeinem Grund in 32- und 64-Bit-Varianten erhältlich ist.

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

Dem ISDeploymentWizard ist eine .ispac-Erweiterung zugeordnet, also doppelklicken Sie und los geht's. Der erste Bildschirm ist neu im Vergleich zur Verwendung der SSDT-Oberfläche, aber danach müssen dieselben Klicks bereitgestellt werden.

ISDeploymentWizard - Befehlszeilenvariante

Was sie mit der Version von 2012 richtig gemacht haben, die mit dem Paketbereitstellungsmodell scheiße war, war, dass die Manifestdatei automatisiert bereitgestellt werden kann. Ich hatte eine Problemumgehung aber es hätte ein Standard "Ding" sein sollen.

Sehen Sie sich also die Registerkarte „Überprüfen“ in der SSDT- oder GUI-Bereitstellung genau an. Ist das nicht eine Schönheit?

Mit der gleichen ausführbaren Datei, ISDeploymentWizard, können wir sowohl ein beaufsichtigtes als auch ein unbeaufsichtigtes Installationsprogramm für unsere .ispac(s) haben. Markieren Sie dort die zweite Zeile, kopieren Sie sie und fügen Sie sie ein, und jetzt können Sie eine kontinuierliche Integration haben!

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

Sie können einen ispac für SQL Server über SQL Server Management Studio, SSMS oder über die Befehlszeile sqlcmd.exe bereitstellen. Während SQLCMD ist nicht unbedingt erforderlich, es vereinfacht das Skript.

Sie müssen Verwenden Sie ein Windows-Konto, um diesen Vorgang auszuführen, ansonsten erhalten Sie die folgende Fehlermeldung.

Außerdem benötigen Sie die Fähigkeit, Massenoperationen durchzuführen (um die .ispac-Datei zu serialisieren) und ssis_admin/sa-Rechte für die SSISDB-Datenbank.

Hier verwenden wir das OPENROWSET mit der Option BULK, um den ispac in eine varbinary-Variable einzulesen. Wir erstellen einen Ordner über catalog.create_folder falls noch nicht vorhanden, und stellen Sie das Projekt dann tatsächlich mit catalog.deploy_project bereit . Sobald dies erledigt ist, überprüfe ich gerne die Tabelle mit den Betriebsmeldungen, um sicherzustellen, dass alles wie erwartet gelaufen ist.

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;

Deine MUTTER

Wie in Ihrem Verwaltetes Objektmodell stellt eine .NET-Schnittstelle zum Bereitstellen von Paketen bereit. Dies ist ein PowerShell-Ansatz zum Bereitstellen eines ispac zusammen mit dem Erstellen des Ordners, da dies eine Option ist, die der ISDeploymentWizard nicht unterstützt.

[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