实施状态更改限制的最佳方式是什么
What's the best way to implement status change restrictions
我在节点中有一个后端应用程序和一个 mysql 数据库。
假设我有这两个表:
实体
id
name
fk_status
1
Hello
1
2
World
2
3
Bread
3
状态
id
description
1
A
2
B
3
C
我想实施一个限制,不允许状态从 A 更改为 C。
状态A只能变成B,B只能变成C,C可以同时变成A和B
- A -> B
- B -> C
- C -> A|B
我应该直接在我的应用程序后端实现这个限制(我猜是使用一些 if 语句) 还是我应该以某种“mysql 方式”实现它? (顺便说一句,我不知道该怎么做)
由于您需要在代码中处理示例中显示的警告,因此实施限制将需要大量工作。
但是 mysql 方式总是会保证这样的更新会发生,独立于前端
CREATE TABLE Entity
(`id` int, `name` varchar(20), `fk_status` int)
;
INSERT INTO Entity
(`id`, `name`, `fk_status`)
VALUES
(1, 'Hello', 1),
(2, 'World', 2),
(3, 'Bread', 3)
;
CREATE TRIGGER teststatus BEFORE UPDATE ON Entity
FOR EACH row
BEGIN
IF OLD.fk_status = 1 AND NEw.fk_status <> 2 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'NOt AlLOWED';
ELSEIF OLD.fk_status = 2 AND NEw.fk_status <> 3 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'NOt AlLOWED';
END IF;
ENd
UPDATE Entity SET `name` = CONCAT( `name`,1) WHERE `id` = 3
✓
UPDATE Entity SET `name` = CONCAT( `name`,1),fk_status = 3 WHERE `id` = 1
NOt AlLOWED
UPDATE Entity SET `name` = CONCAT( `name`,1),fk_status = 1 WHERE `id` = 2
NOt AlLOWED
SELECT * FROM Entity
id | name | fk_status
-: | :----- | --------:
1 | Hello | 1
2 | World | 2
3 | Bread1 | 3
db<>fiddle here
我在节点中有一个后端应用程序和一个 mysql 数据库。
假设我有这两个表:
实体
id | name | fk_status |
---|---|---|
1 | Hello | 1 |
2 | World | 2 |
3 | Bread | 3 |
状态
id | description |
---|---|
1 | A |
2 | B |
3 | C |
我想实施一个限制,不允许状态从 A 更改为 C。
状态A只能变成B,B只能变成C,C可以同时变成A和B
- A -> B
- B -> C
- C -> A|B
我应该直接在我的应用程序后端实现这个限制(我猜是使用一些 if 语句) 还是我应该以某种“mysql 方式”实现它? (顺便说一句,我不知道该怎么做)
由于您需要在代码中处理示例中显示的警告,因此实施限制将需要大量工作。
但是 mysql 方式总是会保证这样的更新会发生,独立于前端
CREATE TABLE Entity (`id` int, `name` varchar(20), `fk_status` int) ;
INSERT INTO Entity (`id`, `name`, `fk_status`) VALUES (1, 'Hello', 1), (2, 'World', 2), (3, 'Bread', 3) ;
CREATE TRIGGER teststatus BEFORE UPDATE ON Entity FOR EACH row BEGIN IF OLD.fk_status = 1 AND NEw.fk_status <> 2 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'NOt AlLOWED'; ELSEIF OLD.fk_status = 2 AND NEw.fk_status <> 3 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'NOt AlLOWED'; END IF; ENd
UPDATE Entity SET `name` = CONCAT( `name`,1) WHERE `id` = 3
✓
UPDATE Entity SET `name` = CONCAT( `name`,1),fk_status = 3 WHERE `id` = 1
NOt AlLOWED
UPDATE Entity SET `name` = CONCAT( `name`,1),fk_status = 1 WHERE `id` = 2
NOt AlLOWED
SELECT * FROM Entity
id | name | fk_status -: | :----- | --------: 1 | Hello | 1 2 | World | 2 3 | Bread1 | 3
db<>fiddle here