【问题标题】:SSIS Project Deployment via Powershell - Project Parameters configured to use Env Variables通过 Powershell 部署 SSIS 项目 - 配置为使用环境变量的项目参数
【发布时间】:2018-03-08 22:28:45
【问题描述】:

虽然我是 Stackoverflow 的长期用户,但这是我的第一个问题。
我正在通过 Powershell 部署 SSIS 项目。我是高级 .NET 开发人员而不是 DBA。我对 SSIS 包部署知之甚少。

我已经通过几个博客/教程来获得我现在所拥有的理解,但仍有一些问题。

我相信我正确设置了我的 SSIS 包。据我了解,连接管理器已正确设置。我在下面发布了我的连接管理器的快照。请注意连接管理器说明旁边的“fx(项目)”。

.

我有两个 Powershell 脚本。一个用于部署包,另一个用于设置环境变量和项目参数。
尽管我设置了关系,但我遇到的问题与执行项目时未选择环境有关。因此我的项目参数看不到我的环境变量。

执行包时收到以下错误:

参数“FlatFileConnectionManager_ConnectionString”配置为使用环境变量,但没有选择环境。选中“环境”复选框并指定要使用的环境,或为参数指定字面值。

参数“LocalHostAdventureWorksDW2012_ConnectionString”配置为使用环境变量,但没有选择环境。选中“环境”复选框并指定要使用的环境,或为参数指定字面值。

Powershell 部署脚本:

Add-Type -AssemblyName "Microsoft.SqlServer.Management.IntegrationServices, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"

$sqlInstance = "xxxxxxx"
$sqlConnectionString = "Data Source=$sqlInstance;Initial Catalog=master;Integrated Security=SSPI"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString
$isNamespace = "Microsoft.SqlServer.Management.IntegrationServices"

$catalogPwd = "xxxxxx"


$ssisServer = New-Object $ISNamespace".IntegrationServices" $sqlConnection


if ($ssisServer.Catalogs.Count -gt 0)             
{             
    $ssisServer.Catalogs["SSISDB"].Drop()             
}            


$catalog = New-Object $isNamespace".Catalog" ($ssisServer, "SSISDB" ,$catalogPwd  )
$catalog.Create()

$ssisCatalog = $ssisServer.Catalogs["SSISDB"]

$ssisFolderName = "PowerShell Demos"
$ssisFolderDescription = "Created with PowerShell"
$ssisFolder = New-Object Microsoft.SqlServer.Management.IntegrationServices.CatalogFolder($ssisCatalog, $ssisFolderName, $ssisFolderDescription)
$ssisFolder.Create()

$ssisProjectName = "TestProject"
[byte[]] $ssisProjectFile = [System.IO.File]::ReadAllBytes("C:\Users\xxxxx\Documents\Visual Studio 2010\Projects\DeployTest\TestProject\bin\Development\TestProject.ispac")
$ssisFolder.DeployProject($ssisProjectName, $ssisProjectFile)

Powershell 环境和项目参数设置脚本:

Add-Type -AssemblyName "Microsoft.SqlServer.Management.IntegrationServices, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"

$sqlInstance = "xxxxxxx"
$sqlConnectionString = "Data Source=$sqlInstance;Initial Catalog=master;Integrated Security=SSPI"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString
$ssisCatalog = "SSISDB"
$isNamespace = "Microsoft.SqlServer.Management.IntegrationServices"

$environmentName = "UPMVariables"
$projectName = "TestProject"
$folderName = "PowerShell Demos"

$integrationServices = New-Object "$isNamespace.IntegrationServices" $sqlConnection

$catalog = $integrationServices.Catalogs[$ssisCatalog]

$folder = $catalog.Folders.Item($folderName)

$environment = $folder.Environments[$environmentName]

if (!$environment)
{
    Write-Host "Creating environment ..." 
    $environment = New-Object "$isNamespace.EnvironmentInfo" ($folder, $environmentName, "testDescription")
    $environment.Create()             
}

# Adding variable to our environment
# Constructor args: variable name, type, default value, sensitivity, description

Write-Host "Adding environment variables ..." 
$eFlatFileConnectonString = $environment.Variables.Item("LocalHostAdventureWorksDW2012_ConnectionString")
if (!$eFlatFileConnectonString)
{

    $environment.Variables.Add("FlatFileConnectionManager_ConnectionString", [System.TypeCode]::String, "C:\newDestination\test.txt", $false, "FlatFile ConnectionString")

    $environment.Alter()

    $eFlatFileConnectonString = $environment.Variables.Item("LocalHostAdventureWorksDW2012_ConnectionString")        

}

$eAdvWorksConnectionString = $environment.Variables.Item("LocalHostAdventureWorksDW2012_ConnectionString")
if (!$eAdvWorksConnectionString)
{

     $environment.Variables.Add( "LocalHostAdventureWorksDW2012_ConnectionString", 
    [System.TypeCode]::String, "Data Source=xxxxxxx;Initial Catalog=AdventureWorksDW2012;Provider=SQLNCLI11.1;User Id=xxxx;Password=xxxxx;", $false, "LocalHostAdventureWorksDW2012 ConnectionString")

    $environment.Alter()

    $eAdvWorksConnectionString = $environment.Variables.Item("LocalHostAdventureWorksDW2012_ConnectionString")
} 


$project = $folder.Projects[$projectName]

$ref = $project.References.Item($environmentName, $folderName)

if (!$ref)
{
    # making project refer to this environment
    Write-Host "Adding environment reference to project ..."
    $project.References.Add($environmentName, $folder.Name)
    $project.Alter() 
}

$projectVariable = $project.Parameters[$eAdvWorksConnectionString.Name]
$project.Parameters[$eAdvWorksConnectionString.Name].Set("Referenced", $eAdvWorksConnectionString.Name) 

$projectVariable = $project.Parameters[$eFlatFileConnectonString.Name]           
$project.Parameters[$eFlatFileConnectonString.Name].Set("Referenced", $eFlatFileConnectonString.Name)            
$project.Alter()

我希望 Stackoverflow 上的某个人了解导致此问题的原因。提前感谢您的帮助和问候!

********* 问题澄清...更多信息 *******

我了解如何手动部署、创建 Sql Server 环境变量和配置项目参数以通过 SSMS 引用 Sql Server 环境变量。我正在尝试通过 Powershell 脚本了解如何在没有人工干预的情况下执行此操作。而且,虽然我可能弄错了,但我相信根据我所做的研究可以自动执行此部署/设置。

当我的问题中包含的脚本执行时,以下事情成功发生。

  • SSIS 项目成功部署到 SQL Server。请看以下快照。

  • 环境变量在脚本运行后出现。可以通过右键单击环境变量对象来查看环境变量,在本例中名为“UPMVariables”。由于 Powershell 脚本的以下部分而存在这些变量。

    $environment.Variables.Add( "LocalHostAdventureWorksDW2012_ConnectionString", [System.TypeCode]::String, "Data Source=xxxxxxxx;Initial Catalog=AdventureWorksDW2012;Provider=SQLNCLI11.1;User Id=xxxx;Password=xxxxxx;", $false, "LocalHostAdventureWorksDW2012 ConnectionString")

    $environment.Variables.Add("FlatFileConnectionManager_ConnectionString", [System.TypeCode]::String, "C:\newDestination\test.txt", $false, "FlatFile ConnectionString")

    $environment.Alter() $eAdvWorksConnectionString = $environment.Variables.Item("LocalHostAdventureWorksDW2012_ConnectionString") $eFlatFileConnectonString = $environment.Variables.Item("FlatFileConnectionManager_ConnectionString")

  • 项目参数在部署后存在,它们应该存在。这些项目参数是在 SSIS 项目创建期间创建的。

  • Sql Server 环境变量和 SSIS 项目之间的关系应通过我的问题中包含的 Powershell 脚本中的以下代码建立。

    $project.References.Add($environmentName, $folder.Name)

    $project.Alter()

  • 这是我提出问题的挑战和原因。当您右键单击 SSIS 包并单击执行(见下图第一张)时,必须在包之前手动选中环境变量复选框可以使用环境变量值。

  • 手动单击环境变量复选框后,Sql Server 环境变量将可用于 SSIS 项目参数。这是脚本未建立的步骤。

  • 这是我试图自动化的步骤,因为手动检查环境变量复选框无法管理。这些 SSIS 包通过作业调度运行。

  • 顺便说一句,我读过的一个教程说你可以生成一个 建立 Project 之间关系的 T-SQL 脚本 通过单击参数和 Sql Server 环境变量 “执行包”对话框左上角的脚本按钮。 请查看脚本快照和“执行包” 下面的对话。我们可以从 VSTS 执行 T-SQL 脚本作为 最后一步,但不幸的是运行此脚本并没有导致 复选框被选中。

TSQL

Declare @execution_id bigint

EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', 
@execution_id=@execution_id OUTPUT, @folder_name=N'PowerShell Demos', 
@project_name=N'TestProject', @use32bitruntime=False, @reference_id=1
Select @execution_id

DECLARE @var0 smallint = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  
@object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var0

EXEC [SSISDB].[catalog].[start_execution] @execution_id
GO

我希望这些额外的信息能让我更深入地了解我所面临的问题。我真诚地感谢任何帮助!谢谢!

****** 2018 年 3 月 6 日更新 ******

可能是我的期望是错误的?据我了解,我应该能够:

  1. 在 SSDT (2012) 中创建我的 SSIS 项目/包。这包括:

    A.创建数据流任务

    B.如果需要,创建连接管理器

    C.使用默认值设置参数...并在需要时将它们标记为必需/敏感

    D.确保创建的参数范围正确(即项目或包级别)

  2. 通过 Powershell 脚本部署 SSIS 包。这包括:

    A.包部署到 SQL Server

    B.创建 SQL Server 环境变量

    C.在项目文件夹和 Sql Server 环境变量之间建立关系

    D.在创建的 SQL Server 环境变量和在 SSDT 中创建的作用域参数之间创建关系

  3. 通过作业调度程序运行包,无需考虑项目参数

我的挑战是创建 SQL Server 环境变量和作用域参数之间的关系。 回顾我昨天发布的 T-SQL。

Declare @execution_id bigint

EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', 
@execution_id=@execution_id OUTPUT, @folder_name=N'PowerShell Demos', 
@project_name=N'TestProject', @use32bitruntime=False, @reference_id=1
Select @execution_id

DECLARE @var0 smallint = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  
@object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var0

EXEC [SSISDB].[catalog].[start_execution] @execution_id
GO

这是为包执行设置日志记录,然后执行包。好东西,但它没有设置要使用的范围参数 SQL Server 环境变量。
我在上一篇文章后发现的是一个 T-SQL 脚本,它在执行包之前首先设置参数。

我知道您必须将 object_type 设置为 30(包模式)或 20(项目模式)执行。这很简单。

是否必须在执行时添加参数和值,如下所示?

@parameter_name=N'pSourceDir'
@parameter_value='c:\Temp'

考虑到我们在 SSDT 中使用默认值创建范围参数,这似乎是多余的。然后 Sql Server 环境变量带有值。这对我来说没有意义,因此我感到困惑。

我非常希望有人会为我澄清这一点。 再次感谢 Stackoverflow!

【问题讨论】:

    标签: powershell deployment ssis


    【解决方案1】:

    早上好 Stackoverflow, 我昨天找到了我的问题的答案。它与环境变量无关,也与 T-SQL 无关。问题出在 Powershell 脚本中的以下语句。

    $projectVariable = $project.Parameters[$eAdvWorksConnectionString.Name]
    $project.Parameters[$eAdvWorksConnectionString.Name].Set("Referenced", 
    $eAdvWorksConnectionString.Name) 
    
    $projectVariable = $project.Parameters[$eFlatFileConnectonString.Name]           
    
    $project.Parameters[$eFlatFileConnectonString.Name].Set("Referenced", 
    $eFlatFileConnectonString.Name)            
    $project.Alter()
    

    我认为上面的语句通过某种方式在 Sql Server 环境变量和项目参数之间建立了关系。我错了。令人困惑的是,当脚本运行时说有问题时,我没有收到错误/反馈。这就是我联系 Stackoverflow 的原因。我从未通过 Powershell 部署过 SSIS 包,因此对预期结果没有深入了解。
    上述方法建立了项目参数,但没有启用相应的 Sql Server 环境变量,无需人工干预。 以下建立项目参数的方法确实可以在无需人工干预的情况下使用 Sql Server 环境变量。

    $projectVariable = $project.Parameters[$eAdvWorksConnectionString.Name]
    $project.Parameters[$eAdvWorksConnectionString.Name].Set("Literal", 
    $eAdvWorksConnectionString.value) 
    
    $projectVariable = $project.Parameters[$eFlatFileConnectonString.Name] 
    $project.Parameters[$eFlatFileConnectonString.Name].Set("Literal", 
    $eFlatFileConnectonString.value)            
    $project.Alter()
    

    我在此处发布此信息,以供其他尝试与我进行相同练习的人使用。 顺便说一句,除了我在这个答案中描述的异常之外,我最初的问题中的 Powershell 脚本运行良好,没有错误。用我在这个答案中描述的更正替换建立项目参数的方法。该脚本将部署 SSIS 包,建立项目参数和 SQL Server 环境变量之间的关系。然后,SSIS 包将准备好运行而无需手动干预。 我希望这对将来的某人有所帮助。
    感谢 billinkc 和 postanote 的帮助……非常感谢! 最好的问候!

    【讨论】:

      【解决方案2】:

      在更多的情况下。如果您看到有关环境变量的问题,这在大多数情况下仅意味着少数情况。

      在 Windows - 高级系统设置/环境变量中:

      1. 您尚未定义用户环境变量。
      2. 您尚未定义系统环境变量。

      这就像尝试运行 Java 的东西,而无需先安装 Java 并设置 JAVA_HOME 系统变量,然后忘记将其添加到系统路径中。您可以在脚本中手动或以编程方式执行此操作,并进行预演。

      [System.Environment]::SetEnvironmentVariable("EnvVarName", "EnvVarPath", "EnvVarTarget")
      
      https://msdn.microsoft.com/en-us/library/system.environment.setenvironmentvariable(v=vs.110).aspx
      

      见这篇文章:

      SSIS 包和配置表中的环境变量

      环境变量可以保存每台服务器上的服务器名称。 在配置管理器中,您以环境的名称放置 多变的。环境变量不保存的值 传递给包的变量或连接。环境 变量保存服务器的名称。这个值告诉包 在哪里查找配置表并读取配置 要传递到包中的配置值的表。

      您可以将环境变量视为指向 包裹。当你将一个包移动到另一个服务器时,它会寻找一个 环境变量。您的包裹在哪个服务器上并不重要 在跑。只要服务器有一个名为的环境变量 正确的名称,它包含正确的服务器的名称, 包将正常运行。

      https://mikedavissql.com/2013/08/12/environment-variables-in-ssis-packages-and-configuration-tables

      另见这篇文章:

      Powershell 错误设置 SSIS 包的环境变量 执行

      我的 Powershell 脚本执行一个 SSIS 包,但首先覆盖了一个 环境变量。 EnvironmentInfo 对象的 Alter 方法 失败并显示一般错误消息:“对象上的操作‘Alter’ [EnvironmentInfo[@Name='MyVariable']' 在执行期间失败。”

      我还尝试删除环境变量并更改 项目参数,但在 Alter 方法上收到相同的错误 项目对象。

      我怀疑这是 1) 使用 32 位版本的缺点 SQL Server 2012,或 2) 权限问题。

      我已确保正在执行的 Windows 帐户对 SSISDB 数据库和 SSIS 目录项目,以及子 文件夹、环境等

      Powershell error setting Environment variable for an SSIS package execution

      **** 更新****

      IndyDev --

      由于我没有像我在评论中所说的那样使用 SSIS 部署环境,所以我回到了文档。这更像是一项 SSIS 功能交易,而不是特定于 PowerShell 的任何东西。

      集成服务 (SSIS) 包和项目参数

      环境变量

      如果参数引用环境变量,则字面量值 从该变量通过指定的环境解析 参考并应用于参数。最后的文字参数 用于包执行的值称为 执行参数值。您指定环境参考 使用“执行”对话框执行

      > 如果项目参数引用了环境变量并且 变量中的文字值在执行时无法解析, 使用设计值。未使用服务器值。

      https://docs.microsoft.com/en-us/sql/integration-services/integration-services-ssis-package-and-project-parameters

      关于这个还有一件事。 “执行包时,您必须手动单击环境变量复选框。”,您是否可以使用 sendkeys 与此对话框进行交互,尽管 sendkeys 可能有点挑剔。

      从我前一段时间学习的前 SQL 课程中,我在 SSIS 主题上的笔记显示...

      1. SSIS 不假定知道要使用哪个环境(即使 只有一个存在)。因此,您要选中该框并选择 正确的环境 - 运行包时总是如此 像这样按需点播。
      2. 您应该使用 SQL 代理作业来执行它,在 作业配置,请选中此框。

      做环境部分的时候---

      1. 否则需要关闭并重新打开 SSIS 解决方案 环境变量不会反映到 SSIS 包中。
      2. 用户应具有管理员权限才能添加环境 变量。

      【讨论】:

      • 感谢您的快速回复,但我想确保我理解。以下 URL 指出了系统和 sql server 环境变量之间的区别。我知道我应该使用 Sql Server 环境变量。您的回答建议使用 Windows 环境变量。 - mssqltips.com/sqlservertip/4810/…
      • 来自URL的措辞......不要将项目部署模型的SSIS环境变量与Windows操作系统的环境变量混淆。在 SQL Server 2005 和 2008 中,我们也可以结合配置文件或表使用这些变量来配置我们的包。当您将项目从项目部署模型转换为旧包部署模型时,这仍然是可能的。对于本技巧的其余部分,我们将使用项目部署模型,因为它更易于使用、更灵活且更健壮。
      • 顺便说一句...部署使用项目部署模型以及项目参数。
      • 我把 Windows 作为人们寻找 Env Var 的常见地方的一个例子,但是文章指针是特定于 SQL 的,这就是为什么我把它包括在一个关于 Win var 的长线程中与其他 var 位置相比。当你到达文章中较低的步骤(具体为23)时,作者还指出了Win var的位置。
      • Powershell 错误设置 SSIS 包执行的环境变量
      【解决方案3】:

      您所做的一切都适合部署、创建环境等等。

      这是您尝试运行产生错误的包的最后一步。

      你有这个 tsql

      Declare @execution_id bigint
      
      EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', 
      @execution_id=@execution_id OUTPUT, @folder_name=N'PowerShell Demos', 
      @project_name=N'TestProject', @use32bitruntime=False, @reference_id=1
      Select @execution_id
      
      DECLARE @var0 smallint = 1
      EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  
      @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var0
      
      EXEC [SSISDB].[catalog].[start_execution] @execution_id
      

      我们创建对项目/包的引用以供执行并确定我们要引用的环境 (@reference_id = 1)

      然后我们设置日志级别(set_execution_parameter_value)并运行它。剩下的就是为此执行设置执行参数值以使用参考/环境值。

      我没有方便的项目来提供这些set_execution_parameter_value 的示例,但是您可以单击 SSMS 中的执行包向导,并在为这些连接管理器指定“使用环境值”后,单击脚本以新建窗口选项

      【讨论】:

      • 首先,非常感谢!!我对您建议我在哪里生成脚本感到有些困惑。如果您说在选中复选框后生成脚本,那就是我在问题中记录的 T-SQL 的地方。它与您在此答案中发布的 T-SQL 相同。所以我还没有找到另一个脚本?对不起,我误会了。我觉得我们非常接近确定这一点。再次感谢!
      • billinkc...昨晚我认真考虑了您的回复。我今天更新了我的问题,希望您能理解并纠正我的误解。如果我的追求变得令人沮丧,我深表歉意。我尽量说清楚。谢谢楼主!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多