2012-11-22 7 views
3

3 개의 필드가있는 테이블이 있는데, 그 중 하나는 "상태"입니다. 상태는 가능한 내용 'a', 'b'또는 'c'가있는 ENUM입니다.mysql : 행의 업데이트를 거부합니다.

"status"= 'b'인 모든 행에 대한 업데이트를 거부하는 방법을 찾아야합니다. 루트 사용자조차 이러한 행을 업데이트 할 수 없도록해야합니다. 그래서이 행을 "최종"으로 만드는 것. status = a 또는 status = c 인 경우 업데이트가 허용되어야합니다.

이렇게 할 방법이 있습니까? 감사합니다.

당신이 트리거를 사용할 수 있습니다
+1

"하지를 루트 사용자는이 행을 갱신 할 수 있어야합니다 "- 이것은 단순히 불가능합니다. 어떤 트리거를 정의하든 루트는 실행 취소 할 수 있습니다. –

+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'그 다음 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

관련 문제