在我的数据库设计中,我使用触发器跟踪历史记录。首先,我有一个Goods
包含以下列的基表:
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
创建了一个新的GoodID
并用新的替换了旧的。此外,aUser2
创建了一个新的GoodID 3
.
我在 SQL Server 2008 R2 中工作,而 SQL 不喜欢多个级联路径。级联路径存在是因为COLUMN5FK
和COLUMN6FK
都指GoodID
. 两个关系中只有一个允许Cascade
另一个关系强制执行操作,如果两者都设置No action
,Update/Delete
则导致不可删除的货物。FK-relationships
(所以在这种情况下,我不能更新/删除GoodID 1
和2
。)
解决方法将是一个触发器。由于我有几个具有相同设置的表,这将需要我为每个以相同方式跟踪历史的表创建/编辑触发器,并且我担心额外的开销以及管理数据库架构更改时的问题。
所以我的问题实际上是,对于这种信息收集是否还有其他更智能的设计/解决方案,或者由于 SQL Server 的限制,我是否应该坚持使用这个。