BEFORE UPDATE触发器阻止所有更新

时间:2017-12-02 18:27:58

标签: mysql triggers mariadb

我有一个包含许多列的表,我正在尝试在特定列上实现一个在更新之前的触发器,以确保该特定列的值只能根据特定的过渡,从1到2到3.

例如,如果我的列中的值为1,那么如果尝试将其从1更改为3,则会拒绝该列的更新,但如果从1更改为2,则会被接受。

下面的代码有效,但是,它当前拒绝所有不符合的更新。例如,如果我尝试更新该表中不同列的行,即使我没有以任何方式更改值列,我的更新也将被拒绝。

DELIMITER //
CREATE TRIGGER transition BEFORE UPDATE ON tbl
FOR EACH ROW
BEGIN
IF (OLD.value = 1 AND NEW.value != 2)
OR (OLD.value = 2 AND NEW.value != 3)
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Incorrect transition of values';
END IF;
END //
DELIMITER;

如何解决这个问题,以便在能够更新其他列的同时建立转换一致性?

我正在使用mariadb 5.5.50。

非常感谢!

1 个答案:

答案 0 :(得分:1)

这将允许值保持不变:

CREATE TRIGGER transition BEFORE UPDATE ON tbl
FOR EACH ROW
BEGIN
  IF (OLD.value = 1 AND NEW.value NOT IN (1, 2))
  OR (OLD.value = 2 AND NEW.value NOT IN (2, 3))
  THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Incorrect transition of values';
  END IF;
END// 

我测试了这个:

mysql> insert into tbl set value=1, other=11;
Query OK, 1 row affected (0.00 sec)

mysql> update tbl set other=22;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update tbl set value=1, other=33;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update tbl set value=2, other=44;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update tbl set value=1, other=55;
ERROR 1644 (45000): Incorrect transition of values

mysql> update tbl set value=2, other=66;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update tbl set value=2, other=77;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update tbl set value=3, other=88;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

但是在价值为3之后会发生什么?它可以改变什么,或者它必须保持3?您可能需要另一个术语来测试它。