13

我在我的 PC 上构建了一个 SSIS 项目,并在执行包时连接到我们网络外部的 SQL 2012 服务器(通过 SQL 身份验证)。现在是时候将项目部署到同一台服务器了,但我碰壁了。在通过内置部署向导时,我输入服务器名称(就像我输入它以使用连接管理器连接到数据库一样)并收到“不受信任的域”错误(它需要 Window 的身份验证而不是 SQL 身份验证)。

我认为我在项目中使用参数设置特定于环境的值也可能是相关的。

如何将 SSIS 项目部署到网络外的 SQL Server?

我还应该补充一点,在我的搜索中,我确实遇到过有人正在努力通过 VPN 连接来做到这一点(没有发布解决方案),这通常是如何完成的?

4

2 回答 2

9

您有 3 个工具用于将 .ispac 文件部署到 SSISDB 目录中。

  1. ISDeploymentWizard.exe
  2. 托管对象模型
  3. TSQL

您已经在使用该向导,但由于身份验证问题而无法正常工作。我认为即使使用您的 MOM 方法,您仍然会遇到身份验证问题。这留下了 TSQL 方法,并且由于您具有有效的登录,因此希望这将起作用。

以下代码将序列化您的 .ispac,如果部署文件夹不存在,则创建部署文件夹,部署项目,然后分配参数值。

在 SSMS 中,您需要将模式更改为 SQLCMD 模式,该模式在查询菜单下可用。完成此操作后,按 Ctrl-Shift-M 以调出宏,它将允许您指定可以找到 .ispac 文件的位置。

USE SSISDB
GO

IF ('$(isPacPath)' = '$' + '(isPacPath)')
BEGIN
    THROW 50000, N'This script must be run in SQLCMD mode.', 1;
END
GO

-- You must be in SQLCMD mode
-- setvar isPacPath "C:\sandbox\SSDTDeploy\TSQLDeploy\bin\Development\TSQLDeploy.ispac"
:setvar isPacPath "<isPacFilePath, nvarchar(4000), C:\sandbox\SSDTDeploy\TSQLDeploy\bin\Development\TSQLDeploy.ispac>"



DECLARE
    @folder_name nvarchar(128) = 'TSQLDeploy'
,   @folder_id bigint = NULL
    -- this must match the ispac
,   @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;

-- Use this to set parameters
-- http://msdn.microsoft.com/en-us/library/ff878162.aspx
EXECUTE catalog.set_object_parameter_value 
    -- Use the value 20 to indicate a project parameter 
    -- or the value 30 to indicate a package parameter
    @object_type = 20 
,   @folder_name = @folder_name
,   @project_name = @project_name
,   @parameter_name = N'' -- nvarchar(128)
,   @parameter_value = NULL -- sql_variant
,   @object_name = N'' -- nvarchar(260)
,   @value_type = '' -- char(1)
--  Use the character V to indicate that parameter_value is a literal value 
-- that will be used by default if no other values are assigned prior 
-- to execution. 
-- Use the character R to indicate that parameter_value is a referenced value 
-- and has been set to the name of an environment variable. 
-- This argument is optional, the character V is used by default

如果您参加了 SQL Pass 峰会 2012 会议,我在关于2012 部署模型的演讲中对此进行了演示,但我没有涉及参数部分。我相信最后一次通话是正确的,但我尚未验证。我已链接到过程调用的文档,以便您可以根据自己的特定需求对其进行定制。

示例PowerShell 实现

2013 年 8 月更新

我从我现在的客户那里学到了一些东西。我们的笔记本电脑已加入主域。我们在客户的 AD 网络上有帐户。每当我需要在客户的世界中“做”某事时,我需要启动我的流程并指示它展示我的“外国”凭据。使这成为可能的是RunAs。备用参考

我创建了一套批处理文件来启动我需要的每个进程。他们采取的形式

runas /netonly:ForeignDomain\Doppelganger "C:\windows\system32\cmd.exe"

我有一个用于命令提示符(上图)、Visual Studio、SSMS、PowerShell、PowerShell ISE 和其他一些需要使用其域的专业应用程序。

使用 runas 方法,我已经能够使用上述所有方法部署包(以及直接从使用外部凭据运行的 Visual Studio 实例进行部署)。

于 2013-01-23T17:23:26.073 回答
6

我在遇到类似问题时使用的一种方法是:

  1. 在 VS 2012 中构建项目。
  2. 将“*.ispac”文件复制到远程服务器。
  3. 双击“*.ispac”,通过选择目标服务器和目录运行向导。
  4. 连接具有所需访问级别和角色的 Windows 帐户,验证包。

唯一的问题是,如果您有多个参数并且您的包已加密,您将无法导入它(这是来自显示的警告消息,我没有测试过加密包)。

希望能帮助到你。

于 2013-09-27T22:41:55.570 回答