나는 테이블에 내가 (지금까지) 변경하고 싶지 않은 행을 가지고 있습니다.MySQL 행을 읽기 전용으로 설정하는 방법은 무엇입니까?
어떤 방식 으로든 업데이트 할 수 없도록 MySQL 행을 읽기 전용으로 설정할 수 있습니까? 그렇다면 어떻게?
그렇지 않은 경우 해당 행의 열 중 하나에서 영구 값을 설정하여 변경할 수 있습니까? 그렇다면 어떻게?
감사합니다.
나는 테이블에 내가 (지금까지) 변경하고 싶지 않은 행을 가지고 있습니다.MySQL 행을 읽기 전용으로 설정하는 방법은 무엇입니까?
어떤 방식 으로든 업데이트 할 수 없도록 MySQL 행을 읽기 전용으로 설정할 수 있습니까? 그렇다면 어떻게?
그렇지 않은 경우 해당 행의 열 중 하나에서 영구 값을 설정하여 변경할 수 있습니까? 그렇다면 어떻게?
감사합니다.
아마도 비즈니스 논리 일 가능성이 높습니다. 비즈니스 논리는 데이터 저장소 계층에 속하지 않은 것 같습니다. 그러나 그럼에도 불구하고 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
와 기록을 "잠금"합니다.
매우 흥미로운 해결책을 가져 주셔서 감사합니다. 이 테이블에 추가 열을 만들 수는 없지만 그 열은 열 중 하나에서 고유 ID를 가지므로 해당 시나리오에서는 어떻게 수행합니까? – ProgrammerGirl
@Programmer : 방아쇠의 IF 문에서 'id'를 테스트하면 : IF OLD.column <=> 'unique_id'THEN ... '. – eggyal
이제 정통 솔루션이 있습니다. 나는 그것을 좋아한다. +1을 명심하십시오. 그러나 mysql에서 하나의 트리거 만 (테이블 당 이벤트 당) 가질 수 있으므로 장래에 다른 트리거가 이미 필요하거나 필요하면 ... 하나로 결합해야합니다. – Kris
아니요, 읽기 전용 행 같은 것은 없습니다. 그러나 특정 사용자에게 업데이트/삭제 권한이 없도록 MySQL 계정을 설정할 수 있습니다. –
Possible : http://stackoverflow.com/questions/3878672/how-to-lock-particular-row-in-mysql –
@Marc B : 내가 언급 한 옵션 중 어느 것도 사용할 수 없습니까? 언급 한 사용자 권한 솔루션이 불행히도 내 문제를 해결하지 않기 때문에 확인하십시오. – ProgrammerGirl