sql >> Database >  >> RDS >> Sqlserver

Hoe een bestaand SSIS-pakket in SQL Server 2012 te implementeren?

Achtergrond

Het 2012 SSIS-projectimplementatiemodel in Visual Studio bevat een bestand voor projectparameters, verbindingsmanagers op projectniveau, pakketten en al het andere dat u aan het project hebt toegevoegd.

In de volgende afbeelding kunt u zien dat ik een oplossing heb met de naam Lifecycle. Die oplossing heeft een project met de naam Lifecycle. Het Lifecycle-project heeft een Project Level Connection Manager ERIADOR gedefinieerd en twee SSIS-pakketten:Package00.dtsx en Package01.dtsx.

Wanneer u een pakket uitvoert, zal Visual Studio achter de schermen eerst alle vereiste projectelementen bouwen/compileren in een inzetbaar kwantum dat een ispac wordt genoemd (uitgesproken als eye-ess-pack, niet als ice-pack). Dit is te vinden in de bin\Development submap voor uw project.

Lifecycle.ispac is een zip-bestand met de volgende inhoud.

Wat betekent dit allemaal? Het grootste verschil is dat u in plaats van alleen een bijgewerkt pakket te implementeren, de hele .ispac moet implementeren. Ja, je moet echt alles opnieuw implementeren, ook al heb je maar één pakket gewijzigd. Zo is het leven.

Hoe implementeer ik pakketten met behulp van het SSIS Project Deployment-model?

Je hebt een host-optie tot je beschikking, maar de 3 dingen die je moet weten zijn

  • waar is mijn ispac
  • op welke server implementeer ik
  • naar welke map gaat dit project

SSDT

Dit zal in het begin waarschijnlijk de meest voorkomende optie zijn. Binnen SQL Server Data Tools, SSDT, heb je de mogelijkheid om op Configuration Manager-niveau te definiëren op welke server en in welke map dingen worden geïmplementeerd. Bij mijn klant heb ik 3 configuraties:Dev, Stage, Production. Zodra u die waarden definieert, worden ze opgeslagen in het .dtproj-bestand en kunt u vervolgens met de rechtermuisknop klikken en naar hartenlust implementeren vanuit Visual Studio.

ISDeploymentWizard - GUI-smaak

SSDT bouwt eigenlijk alleen maar de oproep naar de ISDeploymentWizard.exe die om de een of andere reden in 32- en 64-bits smaken wordt geleverd.

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

Een .ispac-extensie is gekoppeld aan de ISDeploymentWizard, dus dubbelklikken en wegwezen. Het eerste scherm is nieuw in vergelijking met het gebruik van de SSDT-interface, maar daarna zal het dezelfde set klikken zijn om te implementeren.

ISDeploymentWizard - opdrachtregelaroma

Wat ze goed deden met de release van 2012 die slecht was met het pakketimplementatiemodel, was dat het manifestbestand op een geautomatiseerde manier kan worden geïmplementeerd. Ik had een oplossing maar het had een standaard "ding" moeten zijn.

Kijk dus goed naar het tabblad Review vanuit de SSDT- of GUI-implementatie. Is dat geen schoonheid?

Met hetzelfde uitvoerbare bestand, ISDeploymentWizard, kunnen we zowel een bewaakt als onbeheerd installatieprogramma hebben voor onze .ispac(s). Markeer daar de tweede regel, kopieer en plak en nu kunt u continue integratie hebben!

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

U kunt een ispac naar SQL Server implementeren via SQL Server Management Studio, SSMS of via de opdrachtregel sqlcmd.exe. Terwijl SQLCMD is niet strikt vereist, het vereenvoudigt het script.

Je moet gebruik een Windows-account om deze bewerking uit te voeren, anders krijgt u de volgende foutmelding.

Verder heb je de mogelijkheid nodig om bulkbewerkingen uit te voeren (om de .ispac te serialiseren) en ssis_admin/sa-rechten op de SSISDB-database.

Hier gebruiken we de OPENROWSET met de BULK-optie om de ispac in een varbinaire variabele in te lezen. We maken een map aan via catalog.create_folder als het nog niet bestaat en vervolgens het project daadwerkelijk implementeert met catalog.deploy_project . Als ik klaar ben, controleer ik graag de tabel met bewerkingsberichten om te controleren of alles is gegaan zoals verwacht.

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;

Je MOEDER

Zoals in, uw Managed objectmodel biedt een .NET-interface voor het implementeren van pakketten. Dit is een PowerShell-aanpak voor het implementeren van een ispac samen met het maken van de map, aangezien dat een optie is die de ISDeploymentWizard niet ondersteunt.

[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


  1. MySQL Latin1-gegevens converteren naar UTF8

  2. Ik kan mijn PHP-pagina niet verbinden met mijn SQL-testserver en database

  3. Genereer een reeks weekintervallen voor een bepaalde maand

  4. PostgreSQL-equivalent voor MySQL GROUP BY