2012-05-08 2 views
31

나는 테이블에 내가 (지금까지) 변경하고 싶지 않은 행을 가지고 있습니다.MySQL 행을 읽기 전용으로 설정하는 방법은 무엇입니까?

어떤 방식 으로든 업데이트 할 수 없도록 MySQL 행을 읽기 전용으로 설정할 수 있습니까? 그렇다면 어떻게?

그렇지 않은 경우 해당 행의 열 중 하나에서 영구 값을 설정하여 변경할 수 있습니까? 그렇다면 어떻게?

감사합니다.

+3

아니요, 읽기 전용 행 같은 것은 없습니다. 그러나 특정 사용자에게 업데이트/삭제 권한이 없도록 MySQL 계정을 설정할 수 있습니다. –

+0

Possible : http://stackoverflow.com/questions/3878672/how-to-lock-particular-row-in-mysql –

+0

@Marc B : 내가 언급 한 옵션 중 어느 것도 사용할 수 없습니까? 언급 한 사용자 권한 솔루션이 불행히도 내 문제를 해결하지 않기 때문에 확인하십시오. – ProgrammerGirl

답변

34

아마도 비즈니스 논리 일 가능성이 높습니다. 비즈니스 논리는 데이터 저장소 계층에 속하지 않은 것 같습니다. 그러나 그럼에도 불구하고 triggers을 사용하여 수행 할 수 있습니다.

"잠긴"레코드를 업데이트하려고하면 오류가 발생하는 BEFORE UPDATE 트리거를 만들 수 있습니다. 오류가 이 발생하기 전에 작업이 착수되기 전에 MySQL은 작업을 중단합니다. 레코드가 삭제되지 않도록하려면 비슷한 트리거 BEFORE DELETE을 만들어야합니다.

당신은 부울 locked 열을 만들 수, 레코드가 "고정"되어 있는지 여부를 확인하려면 다음

ALTER TABLE my_table ADD COLUMN locked BOOLEAN NOT NULL DEFAULT FALSE; 

DELIMITER ;; 

CREATE TRIGGER foo_upd BEFORE UPDATE ON my_table FOR EACH ROW 
IF OLD.locked THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update locked record'; 
END IF;; 

CREATE TRIGGER foo_del BEFORE DELETE ON my_table FOR EACH ROW 
IF OLD.locked THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete locked record'; 
END IF;; 

DELIMITER ; 

UPDATE my_table SET locked = TRUE WHERE ...; 

SIGNAL 것을이 MySQL은 5.5에서 소개되었습니다. 이전 버전에서는 MySQL에서 오류를 발생시키는 잘못된 동작을 수행해야합니다. 예를 들어 존재하지 않는 프로 시저를 호출하는 경우가 있습니다. 다시 CALL raise_error;


I cannot create an additional column on this table, but the row has a unique id in one of the columns, so how would I do this for that scenario?

와 만약 당신이 절대적으로해야 장소에 저장이 논리 계층과 이외의 다른 수단을 통해 고정 기록을 식별 할 수없는 PK-당신 하드 코드 당신의 방아쇠로 시험하십시오;

DELIMITER ;; 

CREATE TRIGGER foo_upd BEFORE UPDATE ON my_table FOR EACH ROW 
IF OLD.id_column <=> 1234 THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update locked record'; 
END IF;; 

CREATE TRIGGER foo_del BEFORE DELETE ON my_table FOR EACH ROW 
IF OLD.id_column <=> 1234 THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete locked record'; 
END IF;; 

DELIMITER ; 

을하지만이 우왕 내가 가능한 한 그것을 피하기 위해 거의 모든을 할 것입니다 : 예를 들어, id_column = 1234와 기록을 "잠금"합니다.

+0

매우 흥미로운 해결책을 가져 주셔서 감사합니다. 이 테이블에 추가 열을 만들 수는 없지만 그 열은 열 중 하나에서 고유 ID를 가지므로 해당 시나리오에서는 어떻게 수행합니까? – ProgrammerGirl

+0

@Programmer : 방아쇠의 IF 문에서 'id'를 테스트하면 : IF OLD.column <=> 'unique_id'THEN ... '. – eggyal

+2

이제 정통 솔루션이 있습니다. 나는 그것을 좋아한다. +1을 명심하십시오. 그러나 mysql에서 하나의 트리거 만 (테이블 당 이벤트 당) 가질 수 있으므로 장래에 다른 트리거가 이미 필요하거나 필요하면 ... 하나로 결합해야합니다. – Kris

관련 문제