非事务性触发器

时间:2015-07-27 11:08:03

标签: sql postgresql triggers

据我所知,如果我们尝试对该操作执行某些触发的表执行某些写操作,并且触发失败,则写操作也将失败。看起来两个操作都在同一个事务中执行。但是可以做到以下几点:

  • 如果触发器由于某种原因(抛出异常或其他原因)而失败:
    • 写一个日志条目,如果可以的话,允许写操作完成。

2 个答案:

答案 0 :(得分:1)

为什么不将它分成2个程序并作为单独的程序进行写入?根据您发布的信息,这是我的建议,如果您需要更多信息,我们需要更多信息 (数据库供应商和版本,并发布您的代码)

答案 1 :(得分:1)

触发器中引发的错误可以通过向触发器代码添加EXCEPTION clause来捕获。异常块可以包含RAISE LOG/RAISE WARNING语句以将消息写入服务器日志(尽管这取决于configuration)。触发触发器的操作仍然可以成功完成。

例如,如果您的触发器主体是:

$$
BEGIN
  INSERT INTO t VALUES (new.id);
  RETURN NULL;
END
$$

然后你可能想要这样的东西:

$$
BEGIN
  INSERT INTO t VALUES (new.id);
  RETURN NULL;
EXCEPTION
  WHEN unique_violation THEN
    RAISE LOG 'Duplicate ID %', new.id;
    RETURN NULL;
END
$$