我在一个表(源)上有一个触发器,数据应该被复制到另一个数据库中的另一个(目标)。我正在尝试为数据实现自定义同步过程:我希望目标数据库(表)将是最新的源数据库(表)。我有 300 张表要同步。其中一些具有不同的物理数据结构。由于不同的数据架构和其他限制(实施时间、环境问题...),我无法使用 Sql Server 的标准方法(复制、DTS ...)。我的目标是:此触发器不应影响源表中记录的 INSERT、DELETE、UPDATE。我试过这样的解决方案:
CREATE TRIGGER dbo.MyTrigger
...
AFTER INSERT
....
BEGIN TRY
--RAISERROR('Test error', 16, 2)
END TRY
BEGIN CATCH
-- nothing
END CATCH
我已插入RAISEERROR
以模拟错误。我希望try/catch
抑制该错误并成功插入(删除或更新)记录。不。这没用。我收到错误:
触发器执行期间引发错误。批处理已中止,并且用户事务(如果有)已回滚。
是否有可能以这种方式实现我的解决方案。如何捕获并保持(抑制)触发器中的任何错误?
try/catch
如果它不起作用,在触发器中使用什么意义?
几乎所有异常都注定了该事务,必须回滚。
来自MSDN 上的“在 Transact-SQL 中使用 TRY...CATCH”
这个例子说明了原因。XACT_STATE() 不注册隐含事务(例如,没有显式 BEGIN TRAN)
我发现了一个有点冒险的*解决方法,它可以抑制在 DML 触发器中发生的“不可提交的事务”。
警告:在触发器中抑制事务错误通常是不安全的,因此在尝试执行此操作之前要仔细考虑。如果同一个表上还有其他 DML 触发器,则此方法非常不安全,因为您可能正在提交另一个触发器打算回滚的无效数据。
要抑制 DML 触发器中发生的严重错误: