不确定这是否属于SO
或其他网站之一,请告诉我是否应该移动它。
以下是我正在使用的内容:
它是一个非常古老的电子商务系统,有一个产品表。此产品表每晚通过Windows任务计划程序更新两个文件。一个文件包含产品信息(名称,描述,颜色,制造商等),另一个文件包含定价,可用库存,仓库位置等信息。解析这些文件和更新数据库中的产品的过程需要几个小时。我无法控制这两个文件。
我需要一种方法来确定两个文件是否更新了数据库中的产品。我只能向拥有两个文件信息的用户显示产品。如果产品仅更新为1,则认为其不完整且无法显示。
截至目前,我正在考虑添加一个触发器来添加/更新到count + 1,并在每次通过这两个任务中的任何一个修改记录/产品时保存到新列。然后再做一个任务来检查该列是否等于2并执行显示或隐藏所需的操作。但我希望可能还有其他一些想法吗?
答案 0 :(得分:1)
使用两列,每个文件的最后一次更新的时间戳。仅显示两个时间戳都在最后X(24?)小时内的记录。
答案 1 :(得分:1)
这个怎么样,有另一个类型为bit(boolean)的列。我们称之为“IsValid”。对于 clean 记录(您知道已由两者更新的记录),该值将为true
。每当发生更新时,您翻转该位(应用NOT
运算符),您可以通过触发轻松完成。因此,当有两个更新(每个文件一个)时,净值再次变为true
。您的应用程序中读取该记录的部分将查看该“IsValid”标志,以确定该记录是否可行。
注意强> 仅当每个文件仅在每次更新中更新记录零次或一次时,此方法才有效。因为如果文件1两次更新相同的记录而文件2什么都不做,那么该标志将错误地将该记录报告为有效。
答案 2 :(得分: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中测试
答案 3 :(得分:0)
假设您有一个具有名为Id_Record的主键的表。
如果您要做的只是显示(或不显示)此表的LATEST更新:使用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中的时间[从1/1/70开始的毫秒])并且您的最大时差是一小时。