【问题标题】:SSMS - Running SSIS package via batch file - resulting table emptySSMS - 通过批处理文件运行 SSIS 包 - 结果表为空
【发布时间】:2019-11-26 13:08:28
【问题描述】:

目前我正在 SQL Server Management Studio (SSMS) 中构建数据库。通过导入/导出向导将几个数据源导入此数据库。导入完成后,我不仅运行导入,还保存了一个 SSIS 包。此 SSIS 包用于安排每周刷新数据源。 在我的 Windows Server 2012 R2 上安装了 Express 版本,因此我手动创建了几个每周运行的批处理文件(通过任务计划程序安排)。这适用于大多数表,但是对于某些表,我遇到了一些奇怪的 (?) 行为。

如下:当通过导入/导出向导创建 SSIS 包并直接运行导入时,该表在数据库中正确显示。也就是说,所有列名和它包含的数千行。 奇怪的是,当执行 SSIS 包(通过批处理文件)时,表是空的(虽然列名是正确的)。对于某些表,我没有遇到这种行为。对于其他人来说,这种行为一直都会遇到。

批处理脚本如下(非常简单): "C:\Program Files (x86)\Microsoft SQL Server\140\DTS\Binn\DTExec.exe" /F "C:\Users\username\ssispackage.dtsx"

批处理文件似乎始终正确运行,因为当我运行批处理文件时表“creation_date”发生了变化。此外,对于所有正确“刷新”的表,这些相同的批处理文件都可以完成这项工作。

SSIS包的一些设置:

  • 数据源:Oracle OLE DB 提供程序
  • 目标:SQL Server Native Client / MS OLE DB Provider for SQL Server(都试过了)
  • 通过查询获取数据(因为我正在从 Oracle 查询多个表);查询解析正确
  • 映射:创建目标表 & 删除并重新创建目标表
  • 已完成删除和重新创建,因为数据源相当小,并且每周/每月(对某些行)有一些更改。

对于通过此方法导入(并每周刷新)的大多数数据源,表格每周都会正确显示(只需删除前一个表格,然后重新创建源)。

我希望有人能向我解释为什么会出现这个问题。如果我需要更多信息,请询问。

提前致谢!

更新:

查看批处理文件的日志时,这是(部分)输出:

Source: ..... "SourceConnectionOLEDB"
Description: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available. Source: "OraOLEDB" Hresult: 0x80004005 Description: **"ORA-01005: null password given; logon denied".**
End Error
.....next error.... "SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. 

因此,SSIS 包中似乎没有正确记住/保存密码? 不过这很奇怪,因为对于大多数表来说,它确实正确存储了密码(因为它们确实正确刷新)。 在设置数据源,即Oracle Provider for OLE DB属性时,我选择了“允许保存密码”选项。那么它应该正确存储密码吗?

【问题讨论】:

  • 您是否在与创建 dts 的 SSMS 向导相同的机器上执行 dtexec.exe 应用程序?可能存在一些网络问题或与操作系统相关的设置。
  • @EzLo 是的,这一切都在 Windows Server 2012 R2 机器上执行。对于大多数表来说,这已经是正常的(它每周刷新这些表,通过删除和重新创建表)。那些还没有起作用的,在直接运行导入(从向导)时起作用,但在执行 SSIS 包本身时不起作用。或者好吧,它们确实执行了,但结果表只有列名。

标签: sql-server ssis


【解决方案1】:

毕竟找到了答案。保存的 .dtsx 文件(SSIS 包)包含连接字符串的变量,它表明密码 (Sensitive="1") 在那里。但是在向导中,我没有选择“使用用户密钥保存敏感数据”。选择此选项时,会添加一个加密字符串。现在 SSIS 包运行良好!

【讨论】:

  • 很高兴您找到了解决方案。需要注意的一点是,请注意“使用 user 键保存敏感数据”,这依赖于创建 DTS 的 Windows 用户,并且如果其他用户执行它会失败。一种不太容易出错的方法是使用密码加密,其中您必须在执行时将/DECRYPT <password> 参数添加到dtexec.exe
  • 很高兴知道,感谢提及。在这种特定情况下,这不会很快成为问题。但是,作为最佳实践,我也会使用密码对其进行加密。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 2017-01-16
  • 1970-01-01
相关资源
最近更新 更多