SSIS:默认日志记录 OnError 不适用于 RetainSameConnection

2024-01-24

我在连接管理器中使用 RetainSameConnection=true ,因为我正在使用事务(如果成功/失败,则最后开始事务、提交或回滚)。

我还使用默认的 SQL Server 日志记录提供程序并选择了 OnError 事件(以及其他事件)。

问题是我看不到 sysssislog 表中记录的 OnError 事件(该表存在并且创建了默认插入 SP) - 我可以看到记录的其他类型的事件。

使用 SQL 探查器,我可以检查 sp_ssis_addlogentry 是否已执行:

exec sp_executesql N'exec sp_ssis_addlogentry @P1、@P2、@P3、@P4、@P5、 @P6、@P7、@P8、@P9、@P10、@P11'、N'@P1 nvarchar(4000)、@P2 nvarchar(4000),@P3 nvarchar(4000),@P4 nvarchar(4000),@P5 唯一标识符、@P6 唯一标识符、@P7 日期时间2(7)、@P8 datetime2(7),@P9 int,@P10 varbinary(8000),@P11 nvarchar(4000)', N'OnError',N'EWOIU027013096',N'ad\oiu099',N'空 AF SINtemp','4CCEB32F-E884-483C-A02F-56D5C8438E44', '15F585B3-AC6C-476F-8A2E-FC926438AC84','2012-07-12 14:46:15','2012-07-12 14:46:15',0,0x, N'违反主键 约束“CIRNAGF0p0_AF”。无法插入重复项 键入对象“dbo.TIRNAGF0_AF”。

但未插入 OnError 事件。

当我将 RetainSameConnection 属性更改为 false 时,它​​可以工作,但我不能依赖我的事务 SQL 任务。

注意:我什至尝试使用 RetainSameConnection=false 创建另一个专门用于日志记录的连接管理器,但它不起作用。

我可以毫无问题地记录到文本文件,但我们需要记录到表。

提前致谢


我无法重现你的问题。根据您的描述,我认为您的包裹看起来像这样。 SO_retain OLE 连接管理器指向我正在工作的数据库,并将 RetainConnection 属性设置为 True。

我添加了事件 OnError 和 OnPre/PostExecute 的日志记录。我运行了该包两次。一次使用 SO_retain 连接管理器,一次使用 SO_no_retain。

执行后,我查询日志,看看发生了什么。SELECT L.id, L.event, L.source, L.executionid FROM dbo.sysdtslog90 L ORDER BY 1;如果您使用的是 2008/2008R2,请将表修改为 dbo.sysssislog。

我的结果是

1   PackageStart    so_Andre_LoggingTrxn    B2D17896-199F-4213-B800-E812CE95D45F
2   OnPreExecute    so_Andre_LoggingTrxn    B2D17896-199F-4213-B800-E812CE95D45F
3   OnPreExecute    Begin tran  B2D17896-199F-4213-B800-E812CE95D45F
13  OnPostExecute   Rollback    B2D17896-199F-4213-B800-E812CE95D45F
14  OnPostExecute   so_Andre_LoggingTrxn    B2D17896-199F-4213-B800-E812CE95D45F
15  PackageEnd  so_Andre_LoggingTrxn    B2D17896-199F-4213-B800-E812CE95D45F

16  PackageStart    so_Andre_LoggingTrxn    F6898ECA-46E7-4760-8885-898FADCBEFFD
17  OnPreExecute    so_Andre_LoggingTrxn    F6898ECA-46E7-4760-8885-898FADCBEFFD
18  OnPreExecute    Begin tran  F6898ECA-46E7-4760-8885-898FADCBEFFD
19  OnPostExecute   Begin tran  F6898ECA-46E7-4760-8885-898FADCBEFFD
20  OnPreExecute    Sequence Container  F6898ECA-46E7-4760-8885-898FADCBEFFD
21  OnPreExecute    Divide by zero  F6898ECA-46E7-4760-8885-898FADCBEFFD
22  OnError Divide by zero  F6898ECA-46E7-4760-8885-898FADCBEFFD
23  OnError Sequence Container  F6898ECA-46E7-4760-8885-898FADCBEFFD
24  OnError so_Andre_LoggingTrxn    F6898ECA-46E7-4760-8885-898FADCBEFFD
25  OnPostExecute   Divide by zero  F6898ECA-46E7-4760-8885-898FADCBEFFD
26  OnPostExecute   Sequence Container  F6898ECA-46E7-4760-8885-898FADCBEFFD
27  OnPreExecute    Rollback    F6898ECA-46E7-4760-8885-898FADCBEFFD
28  OnPostExecute   Rollback    F6898ECA-46E7-4760-8885-898FADCBEFFD
29  OnPostExecute   so_Andre_LoggingTrxn    F6898ECA-46E7-4760-8885-898FADCBEFFD
30  PackageEnd  so_Andre_LoggingTrxn    F6898ECA-46E7-4760-8885-898FADCBEFFD

正如您所看到的,事情正在按照交易中的预期发生。在第一次执行中,包开始触发记录的事件(PackageStart、OnPreExecute)。源“Begin tran”的 OnPreExecute 是我们看到的最后一件事,直到“Rollback”的 OnPostExecute 触发。然而,ID 之间存在间隙。该间隙是事务下发生的所有插入。该事务被回滚,因此所有工作都被撤消,唯一的指标是消耗的身份值。

当我将日志记录更改为对连接管理器使用 SO_no_retain 时,我看到正在记录 OnError 事件。

edits

您正在日志中看到第一组条目,但希望看到第二组条目。

理解为什么会这样是至关重要的交易如何运作 http://www.sqlteam.com/article/introduction-to-transactions。事务将工作语句打包成一个块,该块是all去上班或者是all将会失败。在您的事务中,包正在发出 sp_ssis_addlogentry 命令。当前事务内部无法说“使这些语句比其他语句更持久”或“将这些语句保留在当前事务之外”。全部或全无,这是交易上下文中的唯一选择。

鉴于此,您的选择要么创建第二个专用于日志记录的连接管理器,如我使用 SO_no_retain CM 所示,要么编写您自己的错误日志记录系统。我真的、真的会提倡前者,因为它是原生行为。不然你会花很多时间

第三种选择

这让我印象深刻,也许你没有意识到这一点。您不需要开始 tran /commit/rollback 模式。 SSIS 可以开箱即用地为您做到这一点。根据包运行的位置,它将需要运行 MSDTC(MS 分布式事务协调器),但简而言之,您告诉包您希望将这些组件加入到事务中,瞧,奇迹发生了,您不需要不必管理它。 SSIS 中的每个任务都有一个 TransactionOption 属性。默认情况下,设置为“支持”。

交易选项设置 http://msdn.microsoft.com/en-us/library/ms137690.aspx

  • 支持的如果存在事务,则任务将加入其中。它不会启动事务。
  • Required这将启动一个事务。如果已经存在,那么它将加入该事务
  • 不需要这不会启动事务,也不会加入正在进行的事务。你can通过让所需和不需要的对象尝试操作相同的资源而使自己陷入僵局,因此请注意您在做什么。

鉴于上面的包,我会做的是

  1. 删除协调事务的执行 SQL 任务,
  2. 将 RetainSameConnection 属性保留为 False
  3. 在控制流级别(或序列容器),我会将 TransactionOption 设置为必需

完成了,就是这样。当包运行时,“工作”会回滚,但日志记录(包括错误)仍会存在。老实说,我写的大多数包看起来都是这样的。我从来没有理由尝试控制自己的交易,因为我(也许是愚蠢的)相信交易协调员可以处理所有这些事情。不过,在使用 SSIS 的 7 年中,我没有遇到过 MSDTC 不处理它的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSIS:默认日志记录 OnError 不适用于 RetainSameConnection 的相关文章

  • C#的数组列表可以用来填充SSIS对象变量吗?

    我已在 C 脚本中填充了一个列表 并将其值分配给 SSIS 对象变量 然后 我使用该对象变量通过循环遍历 For every do 枚举器来执行一些 SQL 查询 我尝试通过 Foreach ado 枚举器执行此操作 但出现错误 X 变量不
  • 临时表是线程安全的吗?

    我正在使用 SQL Server 2000 它的许多存储过程广泛使用临时表 数据库的流量很大 我担心创建和删除临时表的线程安全性 假设我有一个存储过程 它创建了一些临时表 它甚至可以将临时表连接到其他临时表等 并且还可以说两个用户同时执行存
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 如何跨多个表强制执行 CHECK 约束

    我有一个在 Microsoft SQL Server 2012 Express 中记录奶牛繁殖信息的数据库 显然 一头牛只有在出生后才能配种 并且在其一生中可能会配种多次 我需要在我的数据库中强制执行这些约束 我目前已经根据下图安排了一个架
  • Visual Studio 2010 中的数据库设计器

    我需要创建一个全新的 Sql Server 2008 数据库 并希望使用 Visual Studio 2010 Ultimate 中的数据库项目 我已经创建了该项目并在下面添加了一个表格dbo架构 桌子 sql仅以纯文本形式显示 但带有颜色
  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • SQL:如何在按部分分组的查询中使用子查询?

    如何在按部分分组的查询中使用子查询 我使用 SQL Server 2008 R2 和 Delphi 2010 我收到此错误 Cannot perform an aggregate function on an expression cont
  • 如何在实体框架中完全锁定一行

    我正在处理的情况是我们正在处理金钱交易 例如 我有一个用户钱包表 其余额位于该行 UserId Wallet Id Balance 现在 在我们的网站和网络服务中 每次发生特定交易时 我们都需要 检查是否有足够的资金可用于执行该交易 从余额
  • 如何使用 Windows 身份验证指定 Windows 用户从 ASP 连接到 MS SQL Server 数据库

    我已经尝试了一个多月的时间来将这里的 ASP 脚本连接到 SQL Server 数据库 但每次我使用这个连接字符串时 Data Source dbServer01 Initial Catalog POS123 Integrated Secu
  • 在c#中创建sql连接

    我是这个网站的新手 也是编程的新手 我目前正在通过销售点创建库存系统 它使用模态和非模态形式 我的问题是 我正在研究change password对话框必须连接到数据库才能覆盖密码字段 我使用的数据库是Microsoft SQL Serve
  • SQL 2008全文索引填充延迟

    我的经理说 在基础表数据更改后 可能需要一段时间才能更新全文搜索索引 例如 如果我有一张桌子Products有一个柱子Description我更新了该描述 然后我可能需要一些时间才能搜索该新描述 真的吗 这需要多长时间 SQL 2008 对
  • SSIS 包卡在“已创建执行”状态

    我最近对我的一个 SSIS 项目部署了更新 自从该项目失败后 它就按计划运行了 SSIS 包似乎停留在 已创建执行 状态 报告中没有任何消息来解释这个问题 我尝试重新部署该项目 但结果保持不变 我最终不得不恢复到早期版本的部署以使系统重新上
  • 以编程方式设置 Logback Appender 路径

    我正在尝试以编程方式设置 Logback 附加程序路径 滚动文件附加器 http logback qos ch apidocs ch qos logback core rolling RollingFileAppender html准确地说
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • SQL Server 连接其他表中不存在的位置

    Service Asset AssetService Id Name Id Name AssetId ServiceId
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • Aptana Studio 3 的错误日志位置?

    格式化文件时 Aptana 报告 无法格式化 有关详细信息 请参阅错误日志 我还没找到错误日志 您可以通过 帮助 gt Aptana gt 查看日志文件 来访问它
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如

随机推荐