Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 具有多个相同引用列的表的SQL Server历史记录跟踪_Sql Server 2008_History_Self Reference_Self Referencing Table - Fatal编程技术网

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将聚合逻辑操作的单个历史条目。