2012-11-22 46 views
3

我有一個3字段的表,其中之一是「狀態」。 狀態是可能含有'a','b'或'c'的ENUM。mysql:拒絕更新行

我需要找到一種方法來拒絕所有具有「status」='b'的行上的更新,甚至不應允許root用戶更新這些行。所以它就像使這一排成爲「最終」。 如果status = a或status = c,則應該允許更新。

有沒有辦法做到這一點? 謝謝!

+1

「不連根用戶應該被允許更新這些行「 - 這根本不可能;無論您定義什麼觸發器,root都可以撤消。 –

+0

您是否嘗試過列權限? http://dev.mysql.com/doc/refman/5.1/en/grant.html#grant-column-privileges – eisberg

回答

2

您可以使用此觸發 - 如果你知道嘟嘟用戶的禍根,並希望讓他更新,那麼你可以使用這個條件

DELIMITER $$ 

CREATE TRIGGER trigger1 
    BEFORE UPDATE 
    ON table1 
    FOR EACH ROW 
BEGIN 
    IF OLD.status = 'b' THEN 
    SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Cannot update value'; 
    END IF; 
END 
$$ 

DELIMITER ; 

-

... 
IF CURRENT_USER() <> '[email protected]' AND OLD.status = 'b' THEN 
    SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Cannot update value'; 
END IF; 
... 
+0

謝謝,這似乎很符合我的情況。 你能解釋一下這個'SIGNAL SQLSTATE'02000'SET MESSAGE_TEXT ='無法更新值';'?那到底是什麼?使用這個觸發器有沒有可能的性能問題?謝謝。 – sladda

+0

所以它的工作原理。最後我想出了一點變化: 'IF OLD.status ='b'AND NEW.status!='b'THEN SIGNAL SQLSTATE'02000'SET MESSAGE_TEXT ='無法更新值'; END IF;' 這允許更新其他2個字段但拒絕「狀態」,而您的解決方案拒絕任何更新,無論是哪個字段。再次感謝@Devart! – sladda

+0

此語句引發錯誤 - http://stackoverflow.com/questions/13511097/mysql-before-insert-trigger-how-can-i-skip-data-insertion-under-condition/13511273#13511273 – Devart