2017-12-02 267 views
1

我有一個包含許多列的表,並且我試圖在更新之前對特定列實施一個觸發器,以確保只能根據特定列更改該特定列的值到1到2到3的特定轉換。BEFORE UPDATE觸發器阻止所有更新

例如,如果列中的值爲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

這將允許值保持不變:

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?您可能需要另一個術語來測試。

+0

感謝您的回答,但我希望能夠從1 - > 2或2 - > 3更改該特定列中的值,但拒絕任何不符合該轉換的更改(例如,1 - > 3 [UPDATE tbl SET value = 3 WHERE value = 1,應該被拒絕)。目前,我的觸發器管理着這一點,但問題是我無法更新表格中的任何其他列,即使它們沒有更改「值」中的任何內容。我怎樣才能解決這個問題? – Olivier

+0

我提供的解決方案符合您的需求。我編輯了我的答案,上面包含了一個測試演示。 –

+0

我的歉意,我誤解了。完美的作品,謝謝! – Olivier