所以,我想将我的软件包部署到3个不同的服务器.基于服务器,连接字符串将不同.由于这仍然是开发阶段,我将不得不不时地重新部署大多数包.实现这一目标的最佳做法是什么?
解决方法
在Integration Services Catalog,在SSISDB下,右键单击并创建一个文件夹给它一个名称,但不要单击确定.而是单击脚本,新建查询编辑器窗口.这样就会发出一个查询
DECLARE @folder_id bigint EXEC [SSISDB].[catalog].[create_folder] @folder_name = N'MyNewFolder',@folder_id = @folder_id OUTPUT SELECT @folder_id EXEC [SSISDB].[catalog].[set_folder_description] @folder_name = N'MyNewFolder',@folder_description = N''
运行它,但是然后保存它,以便您可以在服务器2和服务器3上创建相同的文件夹.顺便说一下,这将是一个主题
创建你的环境
刷新SSISDB下的下拉列表,找到您新创建的文件夹.展开它,在环境下,右键单击并创建新环境.给它一个名字和描述,但不要点击确定.而是单击脚本,新建查询编辑器窗口.
我们现在有这个代码
EXEC [SSISDB].[catalog].[create_environment] @environment_name = N'DatabaseConnections',@environment_description = N'',@folder_name = N'MyNewFolder'
运行它并将其保存以部署到服务器2和3.
将值添加到环境中
刷新“环境”树,并在“新建环境”的“属性”窗口下,单击“变量”选项卡,并为“连接”字符串或其他任何内容添加条目.这是真的,真的不想单击确定.而是单击脚本,新建查询编辑器窗口.
DECLARE @var sql_variant = N'ITooAmAConnectionString' EXEC [SSISDB].[catalog].[create_environment_variable] @variable_name = N'CRMDB',@sensitive = False,@description = N'',@environment_name = N'DatabaseConnections',@folder_name = N'MyNewFolder',@value = @var,@data_type = N'String' GO DECLARE @var sql_variant = N'IAmAConnectionString' EXEC [SSISDB].[catalog].[create_environment_variable] @variable_name = N'SalesDB',@data_type = N'String' GO
运行该查询,然后保存.现在,当您部署到环境2和3时,您只需更改@var的值即可
组态
到目前为止,我们已经简单地将自己定位成为我们的软件包拥有一套一致的文件夹,环境和变量.现在我们需要实际使用它们对一套软件包.这将假定您的包已经部署到上述步骤和现在之间的文件夹.
右键单击要配置的包/项目.你最有可能希望项目.
>单击“参考”选项卡.添加…并使用DatabaseConnections,或任何您称之为您的
>单击返回参数.单击连接管理器选项卡.查找连接管理器并在连接字符串中单击椭圆并将其更改为“使用环境变量”并找到您的值
>不要点击确定!脚本 – >新查询编辑器窗口
在这一点上,您将有一个脚本来添加对环境变量的引用(因此可以使用它),然后将存储的包值与来自Environment的包重叠.
DECLARE @reference_id bigint EXEC [SSISDB].[catalog].[create_environment_reference] @environment_name = N'DatabaseConnections',@reference_id = @reference_id OUTPUT,@project_name = N'HandlingPasswords',@reference_type = R SELECT @reference_id GO EXEC [SSISDB].[catalog].[set_object_parameter_value] @object_type = 30,@parameter_name = N'CM.tempdb.ConnectionString',@object_name = N'ClassicApproach.dtsx',@value_type = R,@parameter_value = N'SalesDB' GO
该脚本应该保存并用于Server 2& 3.
工作
所有这些都是您可以使用的配置.当您从作业计划程序包执行时,最终将执行如下所示的作业步骤
EXEC msdb.dbo.sp_add_jobstep @job_name = N'Demo job',@step_name = N'SSIS job step',@subsystem = N'SSIS',@command = N'/ISSERVER "\"\SSISDB\MyNewFolder\HandlingPasswords\ClassicApproach.dtsx\"" /SERVER "\".\dev2014\"" /ENVREFERENCE 1 /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO sqlAGENT /REPORTING E'
命令显然是重要的一部分.
>我们正在运行包ClassicApproach
>使用Dev2014的实例在当前服务器上运行此操作
>使用环境参考1
>我们使用标准日志记录级别.
>这是一个同步调用,意味着代理将等到包完成之后才能进入下一步
环境参考
您会注意到,除了我们的环境参考之外,所有上述都是漂亮的和指定的文本字符串,而不是随机整数值.这是因为您可以为多个文件夹中的环境具有相同的文本名称.类似于如何将同一项目部署到多个文件夹,但无论如何,SSIS开发人员选择在使用“随机”整数值时为包提供完全限定的路径.要确定您的环境ID,您可以运行以下查询
SELECT ER.reference_id AS ReferenceId,E.name AS EnvironmentName,F.name AS FolderName,P.name AS ProjectName FROM SSISDB.catalog.environments AS E INNER JOIN SSISDB.catalog.folders AS F ON F.folder_id = E.folder_id INNER JOIN SSISDB.catalog.projects AS P ON P.folder_id = F.folder_id INNER JOIN SSISDB.catalog.environment_references AS ER ON ER.project_id = P.project_id ORDER BY ER.reference_id;
或者浏览文件夹/环境下的Integration Services Catalog,然后双击所需的环境.在生成的“环境属性”窗口中,“名称”和“标识符”将被显示为灰色,它是您需要在sql代理程序的作业步骤命令中用于/ ENVREFERENCE值的标识符属性值.
包起来
如果您小心并且保存向导为您所做的每一件事情,那么在整个环境中迁移更改时,只能有一件事情需要更改.这将导致干净,顺利,可重复的迁移过程,并且您想知道为什么您希望回到XML文件或任何其他配置方法.