Integration  Services 包在部署过程中,经常会出现这样那样的问题,让人摸不着头脑,很是烦人。下面我就将我在部署过程中,遇到的一些问题整理出来,以供大家参考。 

  (一)SSIS包在SQL Server Business Intelligence Development Studio环境中运行正常,通过DTExecUI.exe 运行也正常,可是一旦部署到Sql Server Agent 中,就不能正常运行,如图所示:

Integration Services包部署常见问题汇总 (转自游子吟) 

(在开发环境运行) 

 Integration Services包部署常见问题汇总 (转自游子吟)

(在Sql Server Agent 中运行)

   从图上的错误信息看出,是数据库登录失败。这就奇怪了,在SQL Server Business Intelligence Development Studio中运行没有问题,而在配置Sql Server Agent Job的过程中,也没有修改过连接配置啊,为什么此时sa 就连接失败了呢?Integration Services包部署常见问题汇总 (转自游子吟)Integration Services包部署常见问题汇总 (转自游子吟)Integration Services包部署常见问题汇总 (转自游子吟)

  (1)我们在SQL Server Business Intelligence Development Studio中,打开解决方案,打开连接管理器,如图所示:

Integration Services包部署常见问题汇总 (转自游子吟) 

  单击[测试连接] ,提示“连接成功”,没有问题啊,纳闷了。

  此路不通,我们换一种方式试试,选择"Windows 身份认证",如图:

Integration Services包部署常见问题汇总 (转自游子吟) 

  单击[测试连接],提示“连接成功”,点击[确定],返回到编辑界面,[生成],再[Deployment],一切正常。

  再切换Sql Server Agent 中,查看Job 的运行历史记录,错误依旧。

  想来想去,不得其解,无奈之下,只好再换一种方法,[启用包配置](配置方法请参见Integration Services 学习(6):包配置),如图:

Integration Services包部署常见问题汇总 (转自游子吟) 

  然后再打开配置文件,修改数据库连接信息。

代码
<?xml version="1.0"?>
<DTSConfiguration>
  
<DTSConfigurationHeading>
    
<DTSConfigurationFileInfo />
  
</DTSConfigurationHeading>
  
<Configuration ConfiguredType="Property" Path="\Package.Connections[ApIisLog].Properties[ConnectionString]" ValueType="String">
    
<ConfiguredValue>Data Source=goumh-hgh;Initial Catalog=ApIisLog;Provider=SQLNCLI10.1;uid=sa;pwd=123456;</ConfiguredValue>
  
</Configuration>  
</DTSConfiguration>

   转机就从这里开始了,回到Sql Server Agent ,查看Job 历史记录,终于如愿以偿,给了一个鲜艳的绿V:成功了。Integration Services包部署常见问题汇总 (转自游子吟)Integration Services包部署常见问题汇总 (转自游子吟)Integration Services包部署常见问题汇总 (转自游子吟)

  此时,再回过头去,想一想我们走过的每一步,终于理出一些头绪来:

   在SQL Server Business Intelligence Development Studio中运行与在Sql Server Agent Service 中运行,除了运行方式不同之外(一个手动执行,一个是定时自动执行),还有一点最大的区别,就是运行身份的不一样。

  在 SQL Server Business Intelligence Development Studio中运行,其数据库连接,无论是基于[Windows 身份认证]还是基于[Sql Server 身份认证],它都是基于服务器的当前登录用户而言的,哪怕是基于[Sql Server 身份认证],而且也勾选上了[保存密码],但是这个密码也是保存在当前用户的个人信息里面的,当换了一个用户的时候,它当然就不可见了。

   在Sql Server Agent 中,回顾一下Job 的部署界面,如图:

Integration Services包部署常见问题汇总 (转自游子吟) 

   [运行身份]:Sql Server 代理服务帐户,这个帐户是一个什么帐户啊,我们再到[服务管理器]中去查看一下,如图:

Integration Services包部署常见问题汇总 (转自游子吟) 

   该服务的运行帐户竟然是[网络服务],走到此处,答案也就显而易见了。

  但是,启用了包配置,其数据库连接信息写入了配置文件,无论什么用户在运行包的时候,都是从这个配置文件重新加载属性值,所以它能成功运行。

   知道了问题的原由,解决这个问题的办法也就多起来了。

  (1)、修改Sql Server Agent Service 的登录帐户为服务器的当前用户。这是最简单的,但不是最好的,可能规范不允许。

  (2)、创建Sql Server Agent 代理帐户(创建方法请参考Integration Services 学习(7):包部署 ),代理帐户的安全凭据也就是服务器的当前用户。

   (二)除了数据库连接的时候,会遇到这样的问题,SSIS中的Web服务任务、FTP任务、发送邮件任务等,只要涉及到需要用户凭据的任务也都会遇到,但是其解决方法,也离不开这三种,当然首选是包配置,它实现简单,扩展性好,维护方便。

  (三)SSIS包启用了包配置,而且一个SSIS包,有多个配置文件(如图),包运行时这些配置文件是如何加载的?

Integration Services包部署常见问题汇总 (转自游子吟)

  包配置文件的加载是按从上到下的顺序加载的,这个时候就会有两种情况了:

        1、 如果这些配置文件是配置不同的属性,则每一个属性都从对应的配置文件读取属性值就可以了。

        2、 如果有多个配置文件,配置同一个属性,则永远取最后一个配置文件的属性值,无论它正确与否。

        3、 配置文件的格式如下: 

<?xml version="1.0"?>
<DTSConfiguration>
    
<DTSConfigurationHeading>
        
<DTSConfigurationFileInfo GeneratedBy="gomh-hgh\goumh" GeneratedFromPackageName="Test Transaction1" GeneratedFromPackageID="{175FF39D-86B8-428A-8A2E-F10CEEDA7186}" GeneratedDate="2010/1/27 16:02:31"/>
    
</DTSConfigurationHeading>
    
<Configuration ConfiguredType="Property" Path="\Package.Connections[TestCsdn].Properties[ConnectionString]" ValueType="String">
        
<ConfiguredValue>Data Source=goumh-hgh;User ID=sa;pwd=123456;Initial Catalog=testcsdn;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;Application Name=SSIS-Test Transaction-{854C37DA-EB41-479D-AB3B-95899481C7CA}LocalHost.testcsdn;</ConfiguredValue>
    
</Configuration>
</DTSConfiguration>

   其实红色背景部分的信息是可以删除的,只是绿色背景部分的信息不变就可以了。

  从这一点我们也可以看出,多个包可以共享同一个配置文件。

  (四)SSIS启用了配置文件,而在DTExecUI.exe 中,又给它添加了一个配置文件(如图),执行的时候,SSIS如何加载配置文件?

Integration Services包部署常见问题汇总 (转自游子吟)

  这种情况与上面的问题就不一样了:

  1、 如果SSIS包中的配置文件与上图中添加的配置文件,都配置相同的属性,则永远以SSIS包中的配置文件为准,DTExecUI.exe(即上图界面)中添加的配置文件的属性值不生效。以图为证。

 Integration Services包部署常见问题汇总 (转自游子吟)

 

   
  2、 如两个配置文件,配置的属性不一样,则两个配置文件同时生效。
  3、 如果上图中添加了多个配置文件,SSIS包加载的原理同SSIS包有多个配置文件的情况一样,请参考上面的问题。

  (五)DTExecUI.EXE中,还有一个连接管理器(如图),配置文件的配置与连接管理器的配置,又是如何加载的呢?

Integration Services包部署常见问题汇总 (转自游子吟)

  连接管理器中的连接,缺省状况下每一项前面的CheckBox 为空,后面的连接字符串不可以编辑,如果勾上前面的CheckBox ,连接字符串的值就可以编辑了。
这种情况下,SSIS包加载时的优先顺序为:SSIS包配置文件-->DTExecUI.exe 中添加的配置文件-->DTExecUI.exe连接管理器的属性值。同一个属性值,以SSIS包配置文件为第一优先。 

相关文章: