내 데이터베이스 디자인에서 트리거를 사용하여 기록을 추적하고 있습니다. 우선, 나는 기본 테이블 다음 열 Goods
이 있습니다여러 개의 동일한 참조 열이있는 테이블의 SQL Server 내역 추적
Tablename: Goods
COLUMN1PK: GoodID
COLUMN2: ArticleCode
COLUMN3: Amount
내가, 삽입과 같은 제품에 대한 모든 작업을 추적 삭제하거나 (열 반드시 변경된 값)을 대체합니다. 재화의 삽입, 갱신, 삭제 또는 대체가있을 수 있습니다. 예를 들어 GoodID 1
의 수명이 다해서 GoodID 2
으로 바뀌 었습니다. 이 정보를 캡처 할 수 있으려면, 내가 테이블에서 같은 GoodID
에 역사 테이블 참조에 두 번째 열을 가진 이외의 다른 옵션을 볼 수 없습니다 Goods
내 기록 테이블은 다음과 같습니다
Tablename: GoodsHistory
COLUMN1PK: GoodHistoryID
COLUMN2: ChangedBy
COLUMN3: DateChanged
COLUMN4: ActionType (like inserted, updated, replaced or deleted)
COLUMN5FK: GoodID (capture any insert/update/'fake'-delete operation)
COLUMN6FK: ReplacedByGoodID (capture the `GoodID` that is the replaced `GoodID`)
이 기록 데이터의 예는 기록이 설정된 참조 :
COLUMN1PK: | 1 | 2 | 3 | 4
COLUMN2: | User1 | User1 | User1 | User2
COLUMN3: | 10/12/2012 | 12/16/2014 | 12/16/2014 | 12/16/2014
COLUMN4: | Inserted | Inserted | Replaced | Inserted
COLUMN5FK: | 1 | 2 | 1 | 3
COLUMN6FK: | NULL | NULL | 2 | NULL
짧은 설명 : GoodID 1
2 년 이후 존재하고 오늘 User1
새로운을 만들어 0으로 변경하고 이전 값을 새 값으로 바꿉니다. 또한 User2
은 새 GoodID 3
을 생성했습니다.
SQL Server 2008 R2에서 작업 중이며 SQL에서 다중 계단식 연결 경로가 마음에 들지 않습니다. 계단식 경로는 COLUMN5FK
및 COLUMN6FK
이 모두 GoodID
을 참조하기 때문에 존재합니다. 두 개의 관계 중 오직 하나만 Cascade
을 허용하고 다른 하나는 Update/Delete
작업시 No action
을 취해야합니다. 두 FK-relationships
이 설정되면 삭제할 수없는 상품이됩니다. (따라서이 경우에는 GoodID 1
과 2
을 업데이트/삭제할 수 없습니다.
해결 방법은 방아쇠입니다. 필자는 동일한 설정을 가진 몇 개의 테이블을 가지고 있기 때문에 이와 동일한 방법으로 내역을 추적하는 각 테이블에 대한 트리거를 작성/편집해야하며 데이터베이스 스키마 변경시 추가 오버 헤드와 관리 문제가 발생할 수 있습니다.
내 질문은 실제로 이런 종류의 정보 수집을위한 다른, 어쩌면 똑똑한 디자인/솔루션이 있는지, 아니면 SQL Server의 한계로 인해이 문제에 집착해야하는지 내 질문입니다.
실제로 캐스케이드 및 fk가 기록 테이블에 필요합니까? 물건을 지우면 기록에서 볼 수 있듯이 역사의 기록도 삭제되고 Col4에서는 삭제되지 않은 것으로 표시됩니다. –
PK는 업데이트되지 않으므로 실제로 기록되지 않습니다. 그러나 Good이 영구적으로 삭제되면 기록에서 삭제해야합니다. –
해결 방법으로 다른 레코드에 대한 자체 참조를위한 열을 포함하는 대체 레코드 2 개를 삽입하는 것이 좋습니다. –