1

내 데이터베이스 디자인에서 트리거를 사용하여 기록을 추적하고 있습니다. 우선, 나는 기본 테이블 다음 열 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에서 다중 계단식 연결 경로가 마음에 들지 않습니다. 계단식 경로는 COLUMN5FKCOLUMN6FK이 모두 GoodID을 참조하기 때문에 존재합니다. 두 개의 관계 중 오직 하나만 Cascade을 허용하고 다른 하나는 Update/Delete 작업시 No action을 취해야합니다. 두 FK-relationships이 설정되면 삭제할 수없는 상품이됩니다. (따라서이 경우에는 GoodID 12을 업데이트/삭제할 수 없습니다.

해결 방법은 방아쇠입니다. 필자는 동일한 설정을 가진 몇 개의 테이블을 가지고 있기 때문에 이와 동일한 방법으로 내역을 추적하는 각 테이블에 대한 트리거를 작성/편집해야하며 데이터베이스 스키마 변경시 추가 오버 헤드와 관리 문제가 발생할 수 있습니다.

내 질문은 실제로 이런 종류의 정보 수집을위한 다른, 어쩌면 똑똑한 디자인/솔루션이 있는지, 아니면 SQL Server의 한계로 인해이 문제에 집착해야하는지 내 질문입니다.

+0

실제로 캐스케이드 및 fk가 기록 테이블에 필요합니까? 물건을 지우면 기록에서 볼 수 있듯이 역사의 기록도 삭제되고 Col4에서는 삭제되지 않은 것으로 표시됩니다. –

+0

PK는 업데이트되지 않으므로 실제로 기록되지 않습니다. 그러나 Good이 영구적으로 삭제되면 기록에서 삭제해야합니다. –

+1

해결 방법으로 다른 레코드에 대한 자체 참조를위한 열을 포함하는 대체 레코드 2 개를 삽입하는 것이 좋습니다. –

답변

1

이휴 (Imho) 역사를 위해 두 가지 이상의 테이블이 필요하다면, 먼저 상품 레코드를 보관해야하며 기본 테이블에 참조가 있어야합니다. 예 :

GoodsActions {Id, GoodId, Action} 
GoodsHistory {UserId, GoodsActionsId, SetId} 

여기서 SetId는 논리 작업에 대한 단일 기록 항목을 집계합니다.

관련 문제