如何在SQL Server 2012中部署现有的SSIS包?

18

我正在处理SSIS Package。我在现有的SSIS Package中添加了一个数据流任务。在添加新任务后,我重新构建了Package,它成功地完成了,没有出现任何错误。 我需要将其部署到开发服务器吗?


1
SSIS 2012版本有两种不同的部署模型:新项目部署模型和现有包部署模型。你会使用哪一个呢?换句话说,看一下你在SSDT中的项目。你是看到了列在第一位的“Project.params”文件,还是看到了“Data Sources”?前者是项目部署模型,后者是包部署模型。 - billinkc
@billinkc:我的SSMS中有SSIDB。我认为这是项目部署模型。如果它是项目部署模型,那么我该如何部署呢? - user3203331
SSDT是Visual Studio。 SSMS很可能是您的查询编辑工具。这是一种项目部署模型http://i.stack.imgur.com/XOH8b.png 这是一种包部署模型http://i.stack.imgur.com/HW0nd.png - billinkc
@billinkc。我正在使用项目部署模型。 - user3203331
3个回答

62

背景

在Visual Studio中的2012 SSIS项目部署模型中,包含了项目参数、项目级别连接管理器、包以及其他你添加到项目中的任何内容。

在下面的图片中,你可以看到我有一个名为Lifecycle的解决方案。该解决方案有一个名为Lifecycle的项目。Lifecycle项目有一个项目级别连接管理器ERIADOR定义和两个SSIS包:Package00.dtsx和Package01.dtsx。

Solution to project to file relationship

当您运行一个包时,Visual Studio会在幕后首先将所有所需的项目元素构建/编译成一个可部署的量子,称为ispac(发音为eye-ess-pack,而不是ice-pack)。这将在您项目的bin\Development子文件夹中找到。

Lifecycle.ispac

Lifecycle.ispac是一个包含以下内容的zip文件。

Exploded ispac

“这是什么意思?最大的区别在于,您需要部署整个.ispac而不仅仅是更新包。是的,即使您只更改了一个包,您也必须重新部署所有内容。这就是生活。”
“我如何使用SSIS项目部署模型部署包?”
“您有一些可用的主机选项,但您需要知道以下3件事:”
“我的ispac在哪里”
“我要部署到哪个服务器”
“该项目部署到哪个文件夹”
“SSDT”
“这可能是您最常见的选项。在SQL Server Data Tools(SSDT)中,您可以在配置管理器级别定义要部署到的服务器和文件夹。在我的客户端,我有3个配置:Dev,Stage,Production。一旦您定义了这些值,它们将保存到.dtproj文件中,然后您可以从Visual Studio右键单击并随心所欲地部署。”

enter image description here

ISDeploymentWizard - GUI风格

SSDT实际上只是构建对某些原因存在32位和64位版本的ISDeploymentWizard.exe的调用。

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

.ispac扩展名与ISDeploymentWizard相关联,双击即可运行。与使用SSDT界面相比,第一个屏幕是新的,但之后,部署将是相同的一组点击操作。

ISDeploymentWizard - 命令行风格

他们在2012年发布中做得正确的是,可以以自动化方式部署清单文件。我有一个workaround,但它应该成为标准“事情”。

因此,请仔细查看来自SSDT或GUI部署的“Review”选项卡。那不是美丽吗?

Silent install option

使用相同的可执行文件ISDeploymentWizard,我们可以为我们的.ispac(s)同时拥有交互式和无人值守安装程序。请突出显示第二行,复制粘贴,现在您可以实现持续集成!
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

您可以通过SQL Server Management Studio(SSMS)或命令行sqlcmd.exe将ispac部署到SQL Server。虽然SQLCMD并非严格要求,但它简化了脚本。

必须使用Windows帐户执行此操作,否则将收到以下错误消息。

不能使用使用SQL Server身份验证的帐户启动操作。请使用使用Windows身份验证的帐户启动操作。

此外,您需要能够执行批量操作(以序列化.ispac),并具有ssis_admin / sa权限以访问SSISDB数据库。

在这里,我们使用带有BULK选项的OPENROWSET将ispac读入varbinary变量中。如果不存在,我们通过catalog.create_folder创建一个文件夹,然后使用catalog.deploy_project实际部署项目。完成后,我喜欢检查操作消息表以验证是否如预期运行。
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;

你的 MOM

就像您的托管对象模型提供了一个.NET接口来部署包。这是一种PowerShell方法,用于部署ispac并创建文件夹,因为这是ISDeploymentWizard不支持的选项。

[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

很好的回答,比尔。另外一件事是,请确保在您部署到的服务器上安装了集成服务。如果没有安装,它将表现为您可以创建一个集成服务目录,但会给出无法定位数据库的错误提示。 - wblanks
非常好的答案。特别感谢您指出部署向导GUI中的命令行表达式。 - James Gardner
谢谢。我尝试了使用SQL身份验证的tsql方法,但遇到了相同的障碍:“无法由使用SQL Server身份验证的帐户启动操作。请使用使用Windows身份验证的帐户启动操作。” - PhilG
@PhilG 我更新了答案,包括需要一个Windows账户的要求。 - billinkc
1
托管对象模型方法还需要使用Windows身份验证的帐户。 - mhenry1384
非常好的答案。意识到ISDeploymentWizard.exe有32位和64位版本,帮助我理解为什么我们的自动化部署(使用64位版本)会将一些第三方任务转换为“SSIS.ReplacementTask”,导致包验证失败。这是因为我们只有32位版本的第三方程序集可用于此特定任务。切换到32位版本的ISDeploymentWizard解决了问题。 - Dan

10

以下是关于在 SSIS 2016 中部署单个包的更新(希望这对您有用)。

随着 SQL Server 2016 和 SSDT 2015 的发布,单个包部署的问题现在已成为过去。有了新的“部署包”选项(VS 2015),可以在项目部署模型中部署单个包。

VS 2015 中的 Deploy Package 选项

通过此新功能,您还可以通过点击并按住控制键(Ctrl)选择要部署的包来部署多个包。

除 Visual Studio 2015 中的“部署包”选项外,您还可以使用其他一些可能性来部署包,例如启动 ISDeploymentWizard 应用程序或进行 命令行部署(此选项在 SSIS 构建和部署自动化或作为持续集成流程的一部分进行管理时是必要的)。 您可以通过导航到本文了解更多信息:http://www.sqlshack.com/single-package-deployment-in-sql-server-integration-services-2016/


1
如果您在SSIS 2012中使用项目模型,每次对包进行更改时都必须部署项目。 您可以简单地执行以下操作:
  • 右键单击项目并选择部署

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接