SQL에서 한 번만 기록한 다음 데이터베이스 테이블 만 읽으려면 어떻게해야합니까?


28

가능합니까?

내 유스 케이스는 원장 테이블이며 일단 레코드가 작성되면 읽기 전용이어야합니다. 즉, 아무도 편집하거나 삭제할 수 없어야합니다. 이것은 원장 테이블 및 테이블과 직접적인 관련이있는 테이블에만 적용됩니다. 동일한 스키마에 다른 테이블이 있으며 정상적으로 업데이트 / 삭제됩니다.

내 이해는 데이터 무결성을 위해 이러한 종류의 제약 조건이 데이터베이스 계층에 적용되어야하지만 깨끗하고 널리 받아 들여지는 방법을 찾을 수 없다는 것입니다. 이것은 내가 더 잘하는 유스 케이스입니다. 응용 프로그램 계층에서?

이상적인 것은 DB 플랫폼이 무엇인지에 관계없이 일반 SQL로 수행하는 방법에 대한 것일 것입니다. 변경 될 수 있기 때문에 요청하기에 너무 많을 수도 있습니다. 플랫폼에 의존하기 위해서는 MySQL의 특징이 선호됩니다.

고맙습니다!

답변:


43

나는 이것을 달성하는 적어도 두 가지 방법을 봅니다. 첫 번째 방법은 부여하지 않는 것입니다 DELETEUPDATE이 추기 그 문제에 대한 테이블, 또는 어떤에서 떨어져 권한에 대한 권한을 INSERT하고 SELECT, 따라서 만 허용하는 사용자에 삽입하거나 선택할 수 있습니다.

다른 옵션은 이 테이블에서 트리거 를 정의 BEFORE UPDATE하고 BEFORE DELETE트리거 SIGNAL명령문 에서 명령문을 사용하여 각각 업데이트 및 삭제를 방지하는 예외를 발생시키는 것입니다.


6
나는 당신의 의도를 분명히하고 그것을 위반하기 위해 여러 가지 신중한 조치를 취해야하기 때문에 두 가지 옵션을 모두 추천 할 것입니다.
Adam Martin

3
트리거는 관리 사용자가 수행 한 트랜잭션을 포함하여 모든 트랜잭션에서 실행되며보다 구체적인 오류 메시지를 표시 할 수 있으므로 더 나은 선택입니다.
Blrfl

10

권한이 확실한 선택 인 것 같지만 ARCHIVE Storage Engine을 사용할 수도 있습니다 . 이 테이블 엔진은 변경되지 않는 대량의 데이터를 기록하도록 설계되었습니다.

ARCHIVE 엔진은 INSERT, REPLACE 및 SELECT를 지원하지만 DELETE 또는 UPDATE는 지원하지 않습니다. ORDER BY 연산, BLOB 열 및 기본적으로 공간 데이터 유형을 제외한 모든 데이터 유형을 지원합니다 (11.5.1 절“공간 데이터 유형”참조). ARCHIVE 엔진은 행 레벨 잠금을 사용합니다.

권한과의 차이점은 확장 된 권한을 가진 사람은 여전히 ​​대부분의 다른 테이블 유형에서 데이터를 변경할 수 있지만 ARCHIVE는 이미 테이블에있는 데이터를 변경할 수 없다는 것입니다.


1
에서 여기 , 그 표시 REPLACE의 일종이다 UPDATE! "REPLACE는 테이블의 이전 행이 PRIMARY KEY 또는 UNIQUE 인덱스의 새 행과 동일한 값을 갖는 경우 새 행이 삽입되기 전에 이전 행이 삭제된다는 점을 제외하고는 INSERT와 똑같이 작동합니다. 13.2.5 절을 참조하십시오. , "INSERT 구문". "
Vérace

7

" Point-Time Architecture "또는 " Temporal Database Architecture "를 살펴보십시오.

데이터베이스 설계 : 특정 시점 아키텍처

대부분의 관계형 데이터베이스 구현에서. 업데이트 및 삭제 명령은 문제 이전에 있던 데이터를 삭제합니다. 그러나 일부 시스템에서는 데이터베이스에서 물리적으로 정보를 삭제하거나 업데이트하지 않아도됩니다. 이 기사에서 Arthur Fuller는 특정 시점 아키텍처 형식으로이 요구 사항에 대한 솔루션을 제시합니다. 데이터베이스 설계는 사용자가 이전 시점에 존재했던대로 데이터베이스 이미지를 손상시키지 않고 다시 작성할 수 있도록합니다. 현재 이미지

임시 데이터베이스

Wikipedia에서 무료 백과 사전
Temporal 데이터베이스는 시간 인스턴스와 관련된 데이터를 저장합니다. 시간 데이터 유형을 제공하고 과거, 현재 및 미래 시간과 관련된 정보를 저장합니다.

두 가지의 기본 아이디어는 삭제하지 않고 데이터를 추가하거나 현재 존재하거나 이전 날짜 시간에 존재했던 데이터를 가져올 수있는 방식으로 데이터를 저장해야한다는 것입니다.

관련 질문은 여기에 : my-time-in-time-in-time-architecture-in-mysql ,

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.