sql >> Databasteknik >  >> RDS >> Sqlserver

Hur distribuerar man ett befintligt SSIS-paket i sql server 2012?

Bakgrund

2012 SSIS Project Deployment Model i Visual Studio innehåller en fil för projektparametrar, anslutningshanterare på projektnivå, paket och allt annat du har lagt till i projektet.

På följande bild kan du se att jag har en lösning som heter Lifecycle. Den lösningen har ett projekt som heter Lifecycle. Livscykelprojektet har en anslutningshanterare på projektnivå ERIADOR definierade och två SSIS-paket:Package00.dtsx och Package01.dtsx.

När du kör ett paket kommer Visual Studio bakom kulisserna först att bygga/kompilera alla nödvändiga projektelement till ett distribuerbart kvantum som kallas en ispac (uttalas eye-ess-pack, inte ice-pack). Detta kommer att hittas i bin\Development undermapp för ditt projekt.

Lifecycle.ispac är en zip-fil med följande innehåll.

Vad betyder allt detta? Den största skillnaden är att istället för att bara distribuera ett uppdaterat paket, måste du distribuera hela .ispac. Ja, du måste verkligen distribuera om allt trots att du bara ändrat ett paket. Så är livet.

Hur distribuerar jag paket med SSIS Project Deployment-modellen?

Du har ett värdalternativ tillgängligt för dig, men de tre sakerna du behöver veta är

  • var är min ispac
  • vilken server distribuerar jag till
  • vilken mapp gör detta projekt till

SSDT

Detta kommer förmodligen att vara ditt vanligaste alternativ i början. Inom SQL Server Data Tools, SSDT, har du möjlighet att definiera på Configuration Manager-nivå vilken server och vilken mapp saker distribueras till. Hos min klient har jag 3 konfigurationer:Dev, Stage, Production. När du väl definierat dessa värden sparas de i .dtproj-filen och du kan sedan högerklicka och distribuera till ditt hjärta från Visual Studio.

ISDeploymentWizard - GUI-smak

SSDT bygger egentligen bara anropet till ISDeploymentWizard.exe som kommer i 32 och 64 bitars varianter av någon anledning.

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

En .ispac-tillägg är kopplad till ISDeploymentWizard så dubbelklicka och du är iväg. Den första skärmen är ny jämfört med att använda SSDT-gränssnittet, men efter det kommer det att vara samma uppsättning klick att distribuera.

ISDeploymentWizard - kommandoradssmak

Vad de fick rätt med 2012 års release som suger med paketdistributionsmodellen var att manifestfilen kan distribueras på ett automatiserat sätt. Jag hade en lösning men det borde ha varit en standard "grej".

Så titta noga på granskningsfliken från antingen SSDT- eller GUI-installationen. Är inte det en skönhet?

Genom att använda samma körbara, ISDeploymentWizard, kan vi ha både ett bemannat och obevakat installationsprogram för våra .ispac(s). Markera den andra raden där, kopiera klistra in och nu kan du ha kontinuerlig integration!

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

Du kan distribuera en ispac till SQL Server via SQL Server Management Studio, SSMS eller genom kommandoraden sqlcmd.exe. Medan SQLCMD är inte strikt obligatoriskt, det förenklar skriptet.

Du måste använd ett Windows-konto för att utföra den här operationen men annars får du följande felmeddelande.

Dessutom behöver du förmågan att utföra bulkoperationer (för att serialisera .ispac) och ssis_admin/sa-rättigheter till SSISDB-databasen.

Här använder vi OPENROWSET med alternativet BULK för att läsa ispac till en varbinär variabel. Vi skapar en mapp via catalog.create_folder om det inte redan finns och sedan implementera projektet med catalog.deploy_project . När det är klart vill jag kolla i operationsmeddelandetabellen för att verifiera att det gick som förväntat.

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;

Din MAMMA

Som i, din Managed Object Model tillhandahåller ett .NET-gränssnitt för att distribuera paket. Detta är en PowerShell-metod för att distribuera en ispac tillsammans med att skapa mappen eftersom det är ett alternativ som ISDeploymentWizard inte stöder.

[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. Hur krypterar man lösenordet i Oracle?

  2. Hur man gör en räkningsfråga baserad på en dag i oracle sql

  3. Prioritet för AND- och ELLER-operatorn i Mysql-valfrågan

  4. Varför kan jag köra SSIS Fuzzy Grouping från Visual Studio men inte det distribuerade paketet?