【发布时间】: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 日更新 ******
可能是我的期望是错误的?据我了解,我应该能够:
-
在 SSDT (2012) 中创建我的 SSIS 项目/包。这包括:
A.创建数据流任务
B.如果需要,创建连接管理器
C.使用默认值设置参数...并在需要时将它们标记为必需/敏感
D.确保创建的参数范围正确(即项目或包级别)
-
通过 Powershell 脚本部署 SSIS 包。这包括:
A.包部署到 SQL Server
B.创建 SQL Server 环境变量
C.在项目文件夹和 Sql Server 环境变量之间建立关系
D.在创建的 SQL Server 环境变量和在 SSDT 中创建的作用域参数之间创建关系
通过作业调度程序运行包,无需考虑项目参数
我的挑战是创建 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