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