1

我在表'a'上有一个插入前触发器,它基本上复制并转换查询以插入表'b'。这是此触发器的伪代码示例:

FOR EACH ROW
BEGIN
  IF @inserting IS NULL THEN
    SET @inserting = 1;
    INSERT INTO b SET
      col1 = NEW.col1
      col2 = NEW.cola
      col3 = some_stored_proc(NEW.col3);
    SET @inserting = NULL;
  END IF
END

但是,您可能会注意到,@inserting如果 INSERT 失败,它将保留为 1。如果插入到表“b”失败,我需要确保将其设置回 NULL,同时导致表“a”上的原始插入也失败(以免两者之间的数据不匹配)。

有没有办法做到这一点?

4

1 回答 1

0

经过一番研究,我发现DECLARE...HANDLERRESIGNAL可以解决这个问题。

FOR EACH ROW
BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    SET @inserting = NULL;
    RESIGNAL;
  END;
  IF @inserting IS NULL THEN
    SET @inserting = 1;
    INSERT INTO b SET
      col1 = NEW.col1
      col2 = NEW.cola
      col3 = some_stored_proc(NEW.col3);
    SET @inserting = NULL;
  END IF;
END

DECLARE EXIT HANDLER FOR SQLEXCEPTION允许您对 SQL 异常执行语句(并在完成时退出当前过程)。

RESIGNAL将传递错误。

于 2013-04-02T15:13:37.993 回答