복붙노트

[SQL] 어떻게 읽기 전용으로 MySQL의 행을 설정하는 방법?

SQL

어떻게 읽기 전용으로 MySQL의 행을 설정하는 방법?

나는 (지금까지) 변경할 수 싶지 않아 테이블의 행이있다.

그것은 읽기 전용 그래서 어떤 방법으로 갱신 할 수없는에 MySQL의 행을 설정할 수 있습니까? 그렇다면, 어떻게?

그렇지 않다면, 그것은 변경 될 수 없도록 그 행의 열 중 하나의 고정 값을 설정하는 것이 가능하다? 그렇다면, 어떻게?

감사.

해결법

  1. ==============================

    1.이것은 아마도 데이터 저장 층에 속하지 않는 비즈니스 로직을, 될 가능성이 높습니다. 그러나, 그럼에도 불구하고 트리거를 사용하여 수행 할 수 있습니다.

    이것은 아마도 데이터 저장 층에 속하지 않는 비즈니스 로직을, 될 가능성이 높습니다. 그러나, 그럼에도 불구하고 트리거를 사용하여 수행 할 수 있습니다.

    당신은 "고정"레코드를 업데이트하는 것입니다 경우 오류를 발생시키는 BEFORE UPDATE 트리거를 만들 수 있습니다; 작업이 수행되기 전에 오류가 발생하기 때문에, MySQL은 그 진행을 중단. 당신은 또한 삭제되는 기록을 방지하려면 삭제하기 전에 비슷한 트리거를 작성해야합니다 것입니다.

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

    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와;

    당신이 절대적으로 저장이 논리를 배치해야합니다 계층과 이외의 다른 수단을 통해 고정 기록을 확인할 수없는 경우 다시, 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 ;
    

    그러나 이것은 절대적으로 끔찍한이고 나는 가능한 한 그것을 피하기 위해 거의 모든 것을 할 것입니다.

  2. from https://stackoverflow.com/questions/10502298/how-to-set-a-mysql-row-to-read-only by cc-by-sa and MIT license