Sql server 2008 具有多个相同引用列的表的SQL Server历史记录跟踪
在我的数据库设计中,我使用触发器跟踪历史记录。首先,我有一个包含以下列的基本表Sql server 2008 具有多个相同引用列的表的SQL Server历史记录跟踪,sql-server-2008,history,self-reference,self-referencing-table,Sql Server 2008,History,Self Reference,Self Referencing Table,在我的数据库设计中,我使用触发器跟踪历史记录。首先,我有一个包含以下列的基本表Goods: Tablename: Goods COLUMN1PK: GoodID COLUMN2: ArticleCode COLUMN3: Amount 我想跟踪货物上的所有操作,如插入、删除或替换(不一定是列的更改值)。可以插入、更新、删除或替换商品。例如,GoodID 1已达到其生存期,并被GoodID 2替换。为了能够捕获这些信息,除了在历史记录表中有第二列引用表Goods 我的历史记录表是: Tablen
Goods
:
Tablename: Goods
COLUMN1PK: GoodID
COLUMN2: ArticleCode
COLUMN3: Amount
我想跟踪货物上的所有操作,如插入、删除或替换(不一定是列的更改值)。可以插入、更新、删除或替换商品。例如,GoodID 1
已达到其生存期,并被GoodID 2
替换。为了能够捕获这些信息,除了在历史记录表中有第二列引用表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
,并用新的替换了旧的。另外,一个User2
创建了一个新的GoodID 3
我在SQLServer2008R2中工作,SQL不喜欢多个级联路径。之所以存在级联路径,是因为COLUMN5FK
和COLUMN6FK
都引用了GoodID
。
这两个关系中只有一个允许级联,而另一个在执行更新/删除
操作时强制执行无操作
,如果同时设置了FK关系
,则会导致无法删除商品。(因此在这种情况下,我无法更新/删除GoodID 1
和2
)
解决办法将是一个触发点。由于我有几个表具有相同的设置,这将要求我以相同的方式为跟踪历史的每个表创建/编辑触发器,并且我担心会增加额外的开销以及在数据库架构更改时管理问题
因此,我的问题实际上是,对于这种信息收集,是否有其他可能更智能的设计/解决方案,或者由于SQL Server的限制,我是否应该坚持使用这种设计/解决方案。我想,如果您需要一个以上的历史记录表,首先将为您的商品保留记录,并且主表将具有引用。e、 g
GoodsActions {Id, GoodId, Action}
GoodsHistory {UserId, GoodsActionsId, SetId}
其中,SetId将为逻辑操作聚合单个历史记录项。您真的需要历史记录表上的cascade和fk吗。从我所看到的情况来看,如果你删除了商品,那么历史记录也会被删除,在Col4PK中没有标记为删除的记录不会被更新,所以出于这个原因,它们实际上不会被更新。但是,一旦一个商品被永久删除,它就需要从历史记录中删除,我建议插入两条记录进行替换,并设置一个列供另一条记录自我参考。我也尝试过,但忘了提及。SQL也不允许在自引用时进行级联。因此,我不得不按正确的顺序删除历史记录表中的某个触发器。如果您需要一个以上的历史记录表,首先将保留商品的记录,主表将具有引用。e、 g.GoodsActions{Id,GoodId,Action}/GoodsHistory{UserId,GoodsActionsId,SetId},其中SetId将聚合逻辑操作的单个历史条目。