programing

MySQL 행을 읽기 전용으로 설정하는 방법이 있습니까?

sourcejob 2022. 12. 13. 20:07
반응형

MySQL 행을 읽기 전용으로 설정하는 방법이 있습니까?

여기 있는 모든 스레드를 읽었지만 내 질문에 대한 간단하고 효과적인 해결책을 찾지 못했습니다.그래서 저는 10.1.37-MariaDB에서 DB를 사용하는 php 스크립트로 사이트를 실행하고 있습니다.

읽기 전용으로 몇 줄(90k부터)만 설정하면 되는 테이블이 1개 있습니다.php 스크립트에 의해 더 이상 업데이트 또는 삭제되지 않습니다.

이 행들은 모두 고유합니다.entry_id예를 들어, 숫자 값을 사용하여entry_id = 12345.

필요한 표에는 다음과 같은 내용도 있습니다.

SELECT * FROM `cb_aggregator_content` ORDER BY `model_last_checked` ASC

추가 시도:

SELECT * FROM `cb_aggregator_content` WHERE `entry_id`=12345 FOR UPDATE;

오류만 발생.감사해요.

생각할 수 있는 솔루션은 다음과 같습니다.

읽기 전용으로 할 프라이머리 키 값을 저장하는 테이블을 만듭니다.

CREATE TABLE cb_aggregator_content_readonly (
  entry_id INT PRIMARY KEY
);
INSERT INTO cb_aggregator_content_readonly SET entry_id = 12345;

읽기 전용이어야 하는 항목 ID를 가진 행을 업데이트하거나 삭제하려고 할 경우 트리거를 실행하여 오류를 발생시킵니다.

DELIMITER ;;
CREATE TRIGGER no_upd_content BEFORE UPDATE ON cb_aggregator_content
FOR EACH ROW BEGIN
  IF EXISTS(SELECT * FROM cb_aggregator_content_readonly WHERE entry_id = OLD.entry_id) THEN
    SIGNAL SQLSTATE '45000' 
      SET MESSAGE_TEXT = 'Please do not update entry ';
  END IF;
END;;

CREATE TRIGGER no_del_content BEFORE DELETE ON cb_aggregator_content
FOR EACH ROW BEGIN
  IF EXISTS(SELECT * FROM cb_aggregator_content_readonly WHERE entry_id = OLD.entry_id) THEN
    SIGNAL SQLSTATE '45000' 
      SET MESSAGE_TEXT = 'Please do not delete entry';
  END IF;
END;;
DELIMITER ;

이제 유지할 행을 업데이트하거나 삭제할 수 없습니다.

mysql> delete from cb_aggregator_content where entry_id = 123;
Query OK, 1 row affected (0.02 sec)

mysql> delete from cb_aggregator_content where entry_id = 12345;
ERROR 1644 (45000): Please do not delete entry

유지할 entry_id를 더 추가할 경우 cb_aggregator_content_readonly 테이블에 값을 더 삽입하기만 하면 됩니다.

MySQL에는 행별 액세스 제어가 없습니다.이렇게 하려면 테이블 전체를 읽기 전용으로 하되, 쓰기 권한을 가진 특별한 사용자를 만듭니다.그런 다음 테이블을 업데이트하는 저장 프로시저를 작성하여 해당 사용자가 소유하도록 합니다.저장 프로시저는 다음 정보를 확인할 수 있습니다.entry_id = 12345업데이트를 수행하지 않습니다.

SELECT ... FOR UPDATE행 쓰기를 막는 것이 아니라 트랜잭션 기간 동안 행을 잠글 뿐입니다.다른 트랜잭션은 트랜잭션이 완료될 때까지 차단되지만, 그런 다음 행을 업데이트할 수 있습니다.

데이터베이스에 액세스하는 사용자의 액세스를 읽기 권한만 가지도록 변경할 수 있습니다.

또는 "잠금"이라고 하는 다른 열을 만들고 쿼리에 매개변수를 추가하여 잠긴 값으로 행을 업데이트하지 않도록 할 수 있습니다.

잠긴 필드를 날짜/시간으로 설정하고 기본값을 null로 설정합니다. 그러면 잠긴 값을 선택하고 잠긴 날짜별로 순서를 만들 수 있습니다.다른 필드를 locked_by로 추가하고 사용자 ID를 추가할 수도 있습니다.

또는 잠긴 테이블을 생성하여 join을 사용할 수 있습니다.잠긴 데이터가 표준이 아닌 경우 이 옵션을 선택합니다.

예:

  UPDATE 
   date = NOW()
  FROM table
  WHERE id = 123 AND locked IS NULL

언급URL : https://stackoverflow.com/questions/55550681/is-any-working-way-to-set-a-mysql-row-to-read-only

반응형