데이터베이스 항목 (데이터)의 버전 관리를 허용하는 방법은 무엇입니까?
기사의 변경 사항을 되돌릴 수있는 컨텐츠 관리 시스템 기능을 생각해보십시오.
그들의 장단점은 무엇입니까?
데이터베이스 항목 (데이터)의 버전 관리를 허용하는 방법은 무엇입니까?
기사의 변경 사항을 되돌릴 수있는 컨텐츠 관리 시스템 기능을 생각해보십시오.
그들의 장단점은 무엇입니까?
답변:
기본적으로 두 가지 접근 방식이 있습니다. 모든 이전 값이 저장된 감사 테이블 또는 테이블의 일부로 시작 / 종료 날짜를 포함하며 모든 업데이트는 이전 레코드를 닫으면서 새 레코드를 만듭니다.
업데이트 : SQL SERVER 2016은이를 디자인 패턴 / 테이블 유형으로 지원합니다 — https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017
한 가지 아이디어는 "삽입 전용 데이터베이스"를 사용하는 것입니다. 기본 아이디어는 행에서 데이터를 삭제하거나 업데이트하지 않는 것입니다 .
추적 할 필요가 각 테이블이있을 것이다 datetime
열을 from
하고 to
. 그것들 NULL
은 각각 의 값 으로 시작합니다 (시간의 시작부터 끝까지). 행을 "변경"해야 할 경우 새 행을 추가하고 동시에 to
이전 행 Now
과 from
추가중인 행을 업데이트합니다 Now
.
자세한 내용은 다음을 참조하십시오.
이 기술은 AuditTrail
레거시 데이터를 관리하기 위해 호출 되며 일종의 변경 기록이 저장됩니다.
이 성격의 질문이 이미 게시 된 것처럼 보입니다.
각 테이블에 대해 트리거를 사용하고 _history (또는 이름을 지정할 수 있음)의 데이터를 유지할 수 있으며 모든 삽입, 업데이트, 기본 테이블에서 삭제하면 트리거가 트리거 되고이 테이블에 세부 정보를 저장할 수 있다고 생각합니다. SQLite 데이터베이스를 사용하는 경우에도 사용할 수 있습니다.
이 메커니즘은 대규모 프로젝트에도 유용합니다. 이 테이블에서 변경 시간 소인과 함께 변경 한 사용자의 정보를 로그 할 수 있습니다. 그런 다음 요구 사항에 맞는 시간 소인으로 테이블을 복원 할 수 있습니다.
모든 데이터베이스에는 트리거를 작성하고 코딩하는 고유 한 방법이 있습니다. SQLite를 사용 하는 경우 구문을 보려면 SQLite.org 를 방문하십시오 . 다른 데이터베이스의 경우 공식 사이트를 방문하십시오.
아마도 Sqlite DB 엔진에 대해 알고있을 것입니다 . 전체 db는 단일 파일로 저장됩니다. api는 가상 파일 시스템도 지원하므로 기본적으로 스토리지를 어디서나 어떤 형식 으로든 구성하고 특정 파일 오프셋에서 읽기 및 쓰기 작업에 응답 할 수 있습니다. 이를위한 가능한 응용 프로그램은 암호화, 압축 등일 수 있습니다. 컨테이너 계층이 데이터베이스, sql 또는 sqlite 파일 형식에 대해 알 필요가 없으며 xRead 및 xWrite 콜백을 준수하는 것이 가장 좋습니다.
아이디어 중 하나는 타임머신 기능을 구현하는 것이 었습니다. 따라서 모든 xWrite 작업은 "실행 취소"기록으로 덮어 쓰는 모든 세그먼트를 저장하며 사용자는 과거에 날짜를 선택하여 db에 포함 된 내용 (아마도 읽기 전용 모드)을 볼 수 있습니다. 나는 아직 예제를 가지고 있지 않지만 ( sqlite 메일 목록에서 그것에 대한 토론이 있었지만) 아마도 다른 엔진이 VFS API를 제공하므로 비슷한 것이 가능합니다. 그리고 일단 구현되면 복잡한 데이터베이스 구조와 호환되어야합니다.
데이터베이스 항목 버전 관리에 사용하는 방법은 감사 테이블을 사용하는 것입니다. 테이블에는 다음과 같은 스키마가 있습니다.
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
그런 다음 추적하려는 테이블의 삽입 / 업데이트 / 삭제에 대한 트리거가 있습니다.
장점 :
단점 :
지금이 버전을하고 있습니다. 모든 레코드에 대해 삽입 날짜, 수정 날짜 및 활성 레코드 부울 플래그가 있습니다. 초기 삽입의 경우 삽입 날짜와 수정 날짜가 모두 Now () (이 예제는 Access에 있음)로 설정되고 활성 레코드 플래그가로 설정됩니다 true
. 그런 다음 해당 레코드를 수정하면 전체 내용을 새 레코드에 복사하고 사용자가 변경하는 필드를 변경하고 삽입 날짜를 원본과 동일하게 유지하고 수정 날짜를 Now ()로 변경합니다. 그런 다음 원본 레코드의 Active Record 플래그를 뒤집고 false
새 레코드를true
. 또한 원래 레코드의 ID를 저장하는 ModifiedRecordsParentID 필드가 있습니다.
그런 다음 쿼리해야 할 경우 레코드를 반환 할 수 있으며 ActiveRecord = true
최신 정보 만 얻을 수 있습니다.
ActiveRecord
깃발이 필요 없습니다 . MAX (*) 행은 항상 현재 레코드 여야합니다. 이전 버전으로 복원하면 단순히 해당 행을 테이블에 다시 삽입합니다.
select top 1 order by id descending
하게 수행하십시오.
또한 시간이 지남에 따라 모든 변경 사항을 DB에 저장하려면 로깅을 확인하고 싶을 수도 있습니다 ( https : //.com/questions/3394132/where-can-i-find-the-mysql-transaction-log )