programing

MySQL 행을 읽기 전용으로 설정하는 방법은 무엇입니까?

muds 2023. 9. 23. 23:11
반응형

MySQL 행을 읽기 전용으로 설정하는 방법은 무엇입니까?

테이블에 변경하고 싶지 않은 행이 있습니다.

MySQL 행을 READ-ONLY로 설정하여 어떤 방법으로도 업데이트할 수 없습니까?만약 그렇다면, 어떻게?

그렇지 않다면 해당 행의 열 중 하나에 영구적인 값을 설정하여 변경할 수 없습니까?만약 그렇다면, 어떻게?

감사해요.

이는 비즈니스 논리일 가능성이 높으며, 데이터 스토리지 계층에 속하지 않을 수도 있습니다.그러나 그럼에도 불구하고 트리거를 사용하여 수행할 수 있습니다.

를 생성할 수 있습니다.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 ...;

MySQL 5.5에 소개된 참고 사항입니다.이전 버전에서는 MySQL에서 오류가 발생하는 몇 가지 잘못된 작업을 수행해야 합니다.나는 종종 존재하지 않는 절차를 호출합니다. 예를 들어,CALL raise_error;


이 테이블에 추가 열을 만들 수는 없지만 열 중 하나에 행에 고유 ID가 있는데 이 시나리오에 대해 어떻게 수행해야 합니까?

다시 말하지만, 반드시 이 논리를 스토리지 계층에 배치해야 하고 PK 이외의 다른 수단을 통해 잠긴 레코드를 식별할 수 없는 경우에는 테스트를 트리거에 하드 코드화할 수 있습니다. 예를 들어 레코드를 다음과 같이 "잠금"할 수 있습니다.id_column = 1234:

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 ;

하지만 이것은 절대적으로 끔찍하고 저는 가능할 때마다 그것을 피하기 위해 거의 모든 것을 할 것입니다.

언급URL : https://stackoverflow.com/questions/10502298/how-to-set-a-mysql-row-to-read-only

반응형