Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como implantar um pacote SSIS existente no sql server 2012?

Plano de fundo


O modelo de implantação do projeto SSIS 2012 no Visual Studio contém um arquivo para parâmetros de projeto, gerenciadores de conexões de nível de projeto, pacotes e qualquer outra coisa que você adicionou ao projeto.

Na imagem a seguir, você pode ver que tenho uma solução chamada Lifecycle. Essa solução tem um projeto chamado Lifecycle. O projeto Lifecycle possui um Gerenciador de Conexão em Nível de Projeto ERIADOR definido e dois pacotes SSIS:Package00.dtsx e Package01.dtsx.



Quando você executa um pacote, nos bastidores, o Visual Studio primeiro compila/compila todos os elementos de projeto necessários em um quantum implantável chamado ispac (pronuncia-se eye-ess-pack, não ice-pack). Isso será encontrado em bin\Development subpasta para seu projeto.



Lifecycle.ispac é um zip arquivado com o seguinte conteúdo.



O que tudo isso significa? A maior diferença é que, em vez de apenas implantar um pacote atualizado, você precisará implantar todo o .ispac. Sim, você realmente precisa reimplantar tudo, mesmo que tenha alterado apenas um pacote. Como a vida.

Como faço para implantar pacotes usando o modelo de implantação do projeto SSIS?


Você tem opções de host disponíveis para você, mas as 3 coisas que você precisa saber são
  • onde está meu ispac
  • em que servidor estou implantando
  • para qual pasta este projeto se destina

SSDT


Esta provavelmente será sua opção mais comum no início. No SQL Server Data Tools, SSDT, você tem a capacidade de definir no nível do Configuration Manager em qual servidor e em qual pasta as coisas são implantadas. No meu cliente, tenho 3 configurações:Dev, Stage, Production. Depois de definir esses valores, eles são salvos no arquivo .dtproj e você pode clicar com o botão direito do mouse e implantar o conteúdo do seu coração no visual studio.


ISDeploymentWizard - sabor de GUI


O SSDT está apenas criando a chamada para o ISDeploymentWizard.exe, que vem em sabores de 32 e 64 bits por algum motivo.
  • C:\Arquivos de Programas\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe
  • C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\ISDeploymentWizard.exe

Uma extensão .ispac está associada ao ISDeploymentWizard, então clique duas vezes e pronto. A primeira tela é nova em comparação com o uso da interface SSDT, mas depois disso, será o mesmo conjunto de cliques para implantar.

ISDeploymentWizard - sabor de linha de comando


O que eles acertaram com o lançamento de 2012 que foi péssimo com o modelo de implantação de pacotes foi que o arquivo de manifesto pode ser implantado de maneira automatizada. Eu tinha uma solução alternativa mas deveria ter sido uma "coisa" padrão.

Portanto, observe atentamente a guia Revisão da implantação do SSDT ou da GUI. Não é uma beleza?



Usando o mesmo executável, ISDeploymentWizard, podemos ter um instalador assistido e não assistido para nosso(s) .ispac(s). Destaque a segunda linha ali, copie e cole e agora você pode ter integração contínua!
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


Você pode implantar um ispac no SQL Server por meio do SQL Server Management Studio, SSMS ou pela linha de comando, sqlcmd.exe. Enquanto SQLCMD não é estritamente necessário, simplifica o script.

Você deve use uma conta do Windows para executar esta operação, caso contrário, você receberá a seguinte mensagem de erro.

Além disso, você precisará da capacidade de realizar operações em massa (para serializar o .ispac) e direitos ssis_admin/sa no banco de dados SSISDB.

Aqui usamos OPENROWSET com a opção BULK para ler o ispac em uma variável varbinary. Criamos uma pasta via catalog.create_folder se ele ainda não existir e, na verdade, implantar o projeto com catalog.deploy_project . Uma vez feito, gosto de verificar a tabela de mensagens de operações para verificar se as coisas ocorreram conforme o esperado.
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;

Sua MÃE


Por exemplo, seu Modelo de objeto gerenciado fornece uma interface .NET para implantação de pacotes. Essa é uma abordagem do PowerShell para implantar um ispac junto com a criação da pasta, pois essa é uma opção que o ISDeploymentWizard não oferece suporte.
[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