【问题标题】:Insert in TABLE_A shouldn't fail if something fails in trigger. How?如果触发器失败,插入 TABLE_A 不应该失败。如何?
【发布时间】: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 中没有代码可以忽略错误并继续,但一切都回滚了。

标签: sql-server


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    看看this other StackOverflow question

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

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