2

不确定这是否属于SO他们的其他网站之一,如果我应该移动它,请告诉我。

这是我正在使用的:
它是一个非常古老的电子商务系统,它有一个产品表。此产品表每晚通过 Windows 任务计划程序更新两个文件。一个文件包含产品信息(名称、描述、颜色、制造商等),另一个文件包含价格、可用库存、仓库位置等信息。解析这些文件和更新数据库中的产品的过程需要几个小时。我无法控制这两个文件。

我需要一种方法来确定这两个文件是否都更新了数据库中的产品。我只能向具有来自这两个文件的信息的用户显示产品。如果产品仅更新了一个,则认为其不完整,无法显示。

截至目前,我正在考虑添加一个触发器以添加/更新到 count+1 并在每次两个任务中的任何一个修改记录/产品时保存到一个新列。然后进行另一项任务以检查该列是否等于 2 并执行显示或隐藏所需的操作。但我希望那里可能有一些其他的想法?

4

4 回答 4

1

使用带有每个文件的最后更新时间戳的两列。仅显示在过去 X (24?) 小时内具有两个时间戳的记录。

于 2012-10-19T19:41:06.860 回答
1

这个怎么样,有另一列位类型(布尔)。我们称之为“IsValid”。对于一个干净的记录(您知道由两者更新的记录),该值将true. 每当发生更新时,您都会翻转该位(应用NOT运算符),您可以通过触发器轻松完成。因此,当有两个更新(每个文件一个)时,净值true再次变为。读取该记录的应用程序部分将查看“IsValid”标志以确定该记录是否可行。

注意 这仅在每个文件仅在每次更新中更新记录零次或一次时才有效。因为如果文件 1 两次更新同一记录而文件 2 什么都不做,那么该标志会错误地将记录报告为有效。

于 2012-10-19T20:46:30.403 回答
1

为了不必担心遗留流程的完整回归测试,我会选择使用触发器将 Product 表上的更新记录到第二个表。

触发器可以通过检查更新的列来确定正在运行的进程。然后我会创建一个简单的查询来返回所有已被两个进程更新的产品。

/* Test tables */
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Product')
  DROP TABLE Product

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'ProductChangeLog')
  DROP TABLE ProductChangeLog
GO

CREATE TABLE Product (
  ProductID INT NOT NULL PRIMARY KEY, 
  ProductName VARCHAR(50) NOT NULL,
  ProductDescription VARCHAR(100) NOT NULL,
  ProductPrice MONEY NOT NULL,
  ProductAvailQty INT NOT NULL
) 

CREATE TABLE ProductChangeLog (
  ChangeLogID INT NOT NULL IDENTITY(1,1), 
  ProductID INT NOT NULL,
  ChangeTime DATETIME NOT NULL,
  ChangeType VARCHAR(50) NOT NULL,
) 
GO 

CREATE TRIGGER tr_Product ON Product 
FOR UPDATE
AS

  INSERT ProductChangeLog (ProductID, ChangeTime, ChangeType) 
  SELECT 
    ProductID,
    GETDATE(),
    -- Log the process which was run depending on columns modified
    CASE WHEN UPDATE(ProductName) OR UPDATE(ProductDescription)
         THEN 'Process1'
         WHEN UPDATE(ProductPrice) OR UPDATE(ProductAvailQty)
         THEN 'Process2'
         ELSE 'Neither'
    END 
  FROM inserted
GO 

INSERT Product 
SELECT 1, 'Blue V-Neck', 'Sweater', 25.00, 100 UNION ALL 
SELECT 2, 'Green V-Neck', 'Sweater', 30.00, 200 UNION ALL
SELECT 3, 'Black crew', 'T-Shirt', 10.00, 45

/* Change two products in first process */
UPDATE Product 
SET ProductDescription = 'Men''s Sweater' 
WHERE ProductDescription = 'Sweater'

/* Change three products in second process */
UPDATE Product
SET ProductPrice = ProductPrice + 10

/* See all changes */
SELECT * 
FROM ProductChangeLog 

DECLARE @today DATETIME
SET @today = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE())) 

/* See all products changed today by both processes */
SELECT * 
FROM Product p 
WHERE EXISTS (
  SELECT * 
  FROM ProductChangeLog 
  WHERE ChangeType = 'Process1'
    AND ChangeTime > @today 
    AND ProductID = p.ProductID 
) 
AND EXISTS ( 
  SELECT * 
  FROM ProductChangeLog 
  WHERE ChangeType = 'Process2'
    AND ChangeTime > @today 
    AND ProductID = p.ProductID 
) 

*在 SQL Server 2005 中测试

于 2012-10-19T22:05:12.073 回答
0

假设您有一个表,它有一个名为 Id_Record 的主键。

如果您只想显示(或不显示)此表的最新更新:使用 Id_Record、Dt_Timestamp_File1、Dt_Timestamp_File2 创建一个单独的表,并为每个文件更新触发一个时间戳。然后定义 2 个时间戳(或您想要的任何其他规则)之间的可接受差异。

那么您可以通过以下方式检索您的记录:

SELECT Id_Record, Ds_Record_Name, Nr_Record_Price, Nr_Record_In_Stock FROM Stock WHERE Id_Record IN (SELECT Id_Record FROM Stock_Update WHERE Dt_Timestamp_File1 > Dt_Timestamp_File2 - 3600000 AND Dt_Timestamp_File1 < Dt_Timestamp_File2 + 3600000)

假设您使用的是 UnixTime(总是更容易比较 unixtime 中的时间 [从 70 年 1 月 1 日开始的毫秒数]),并且您的最大时差是一小时。

于 2012-10-19T19:44:32.663 回答