如果触发器失败,插入 TABLE_A 不应该失败。如何?

Posted

技术标签:

【中文标题】如果触发器失败,插入 TABLE_A 不应该失败。如何?【英文标题】:Insert in TABLE_A shouldn't fail if something fails in trigger. How? 【发布时间】:2012-01-31 14:54:27 【问题描述】:

我有 TABLE_A,在另一个数据库上我有 TABLE_B。 TABLE_A 上有一个触发器将插入从 TABLE_A 复制到 TABLE_B。如果触发器发生故障,则 TABLE_A 上的插入不应失败(我无法控制 TABLE_A,可以删除或重命名列,等等...)。

我正在使用 SQL Server 2005。

我尝试过 TRY ... CATCH,但没有成功。

谢谢。

【问题讨论】:

这是AFTER INSERT吗?另外你用TRY...CATCH做了什么? 我在 CATCH 中没有代码可以忽略错误并继续,但一切都回滚了。 【参考方案1】:

使用触发器 - 是一种原子操作 - 它可以完成而没有错误,也可以使整个操作失败(INSERT+触发器)。尝试使用其他变体,例如使用 SP 向表中添加记录。

【讨论】:

【参考方案2】:

看看this other *** question。

但最终,触发器在隐式事务中运行,这与您正在寻找的内容背道而驰。解决这个问题的不同方法可能是您最好的选择。

【讨论】:

【参考方案3】:

我会将其移至异步样式操作。让对 TABLE_A 的更改操作对复制相应记录的请求进行排队,并有一个单独的进程监控该队列。这样您就不会将复制过程绑定到插入事务中,而只是将复制操作的排队绑定到插入事务中。

【讨论】:

如何实现排队过程? @Neves 由于数据显然不能完美同步(否则您会希望触发器失败),因此可以接受某种程度的差异。问题是这段时间应该多长。如果更改量较低,您可以使用 sp_start_job 启动作业,或者您可以写入表并定期安排作业查看表并执行同步。我不确定事务之外是否存在高性能更新 - 所有这些都涉及在事务之外建立另一个连接(例如通过 SQLCLR)。

以上是关于如果触发器失败,插入 TABLE_A 不应该失败。如何?的主要内容,如果未能解决你的问题,请参考以下文章

PetaPoco 在带触发器的表上插入失败

GreenPlum - 带触发器的表 - 插入失败

上传 csv 并插入或更新结果失败

尝试插入重复记录后,如果不存在则插入失败

带有分析的 Oracle 更新语句失败

使用本机 SQL 创建表适用于 Hibernate/HSQLDB,插入失败。为啥?