0

从 SQL 开始,这对我来说很棘手。我有 4 张桌子。我的逻辑问题比我认为的其他任何问题都多。我有一张名为 Vehicle 的桌子。在我的应用程序中,此 Vehicle 表中更改的任何记录都会插入到 VLog 表中。Vehicle的主键是VehicleID,它与VLog中的VehicleID相关。在 SQL 中,我不确定如何归档这两个表。我有两个存档表。VehicleArchive 和 VLogArchive。在我的应用程序中,我能够根据某个参数“归档”某些记录。这很简单,因为我使用的是网格视图,并且可以验证 VehicleID 并将具有该 VehicleID 的任何记录插入到 VLogArchive 和 VehicleArchive 中。但是,我将要处理实时记录,并且想知道 SQL 中是否有解决方案。VLog 中的每个 VehicleID 都有多个记录,因为 VLog 会跟踪 Vehicle 中所做的所有更改。在我的应用程序本身中,单击“更新”按钮时,我可以通过将 VLog 中的记录与网格视图中的 VehicleID 进行比较,然后从 VLog 中删除所述记录,并将位置更改为“文件室”,从而将记录插入 VLogArchive。 " 然后,只要位置是“文件室”,它就会继续将来自 Vehicle 的记录插入到 VehicleArchive 中,方法是再次将其与网格视图中的 VehicleID 进行比较。这似乎倒退了,但我不得不这样做,因为如果我在从 VLog 中删除相关记录之前尝试从 Vehicle 中删除记录,它不会因为它是相关的而被删除。

我发现了这个这个,但我不肯定这些是我需要的方法。谢谢您的帮助!

4

2 回答 2

2

不要那样做;将归档的 int(1) 字段添加到表中并使用它来过滤视图。

车辆

然后将其用作gridview的源

SELECT * FROM Vehicle WHERE Archived=0

要存档记录,您可以这样做

UPDATE Vehicle SET Archived=1 WHERE ID=1

在生产系统上移动这样的记录绝非易事,而且几乎肯定会导致比您想象的更多的问题。

如果你真的想这样做;那么你将不得不逐条记录;通过复制数据;当然,这会破坏引用完整性,如果有任何其他表引用 Vehicle。

您可以在代码中作为后台过程执行此操作,也可以(更好)在数据库服务器上使用 SQL / SSIS

于 2013-10-29T13:40:55.443 回答
2

我不同意@Richard。如果可能的话,我总是倾向于让你的桌子保持“精简和刻薄”。如果数据是旧的/未使用的,请将其从您的生产表中取出!在事务表中保留不必要的记录会带来许多性能和维护风险。由于您将在您运行的每个选择查询中包含对该标志的检查(使用@Richard 建议的视图),您将不得不将该标志添加到每个非聚集索引以避免临界点问题。您还将遇到唯一约束强制的问题(如果您的数据库设计正确)以及使查询更容易出错(如果有人编写报告但不使用视图怎么办?)。像这样的元数据标志的问题列表一直在继续。只是不要这样做。

有很多不同的方法可以在归档数据上剥洋葱。我自己更喜欢更频繁和更小的交易。如果您要归档到同一台服务器,请在第一个链接中使用 T-SQL。如果要归档到不同的服务器,请使用 SSIS。

于 2013-10-29T13:59:35.830 回答