1

我有一种情况,我使用 RowVersion 列和 Binary(8) 列来跟踪行是否已更改。

理想情况下:

RowVersion != Binary(8)

然后,该记录发生了变化。真正的问题是我找不到将两列设置为相等的好方法。如果我更新 Binary 字段,则更新查询会增加该记录的 RowVersion 字段。我已经搞砸了乐观地增加 Binary 字段,它几乎可以工作。关键是我必须将 Binary 字段增加 UPDATE 查询将影响的记录总数。关于如何暂停 rowversion 或确定在更新语句结束时使用更新语句中的值的任何想法?

为清楚起见,以下是使两个字段匹配的示例:

    UPDATE [table] SET BinaryField = MyRowVersion + 
(SELECT COUNT(*) FROM [table] WHERE (MyRowVersion != BinaryField)) 
WHERE (MyRowVersion != BinaryField)
4

2 回答 2

2

我不太确定没有更好的方法可以做到这一点,但这里有一个选择:

1.创建另一个表,其中仅包含表的 PK 和 binary(8) 字段。

2.将行版本从表的行复制到第二个表的相关行(在您想要的时间点)。

3.然后,稍后您可以比较这两个字段(rowversion,binary(8))。

--- 1 ---
CREATE TABLE MyTest 
( myKey INT PRIMARY KEY
, myData INT
, RV rowversion
) ;

CREATE TABLE MyTestCheck
( myKey INT PRIMARY KEY
, RVcheck binary(8)
, FOREIGN KEY (myKey) REFERENCES MyTest(myKey)
) ;

--- 2 ---
UPDATE MyTestCheck 
SET RVcheck = RV
FROM MyTest 
WHERE MyTest.myKey = MyTestCheck.myKey ;

INSERT INTO MyTestCheck
  SELECT myKey, RV
  FROM MyTest
  WHERE myKey NOT IN
    ( SELECT myKey
      FROM MyTestCheck
    ) ;

--- 3 ---
SELECT m.*, m2.RVcheck 
FROM MyTest AS m
  LEFT JOIN MyTestCheck AS m2
    ON m2.myKey = m.myKey 
WHERE m2.RVcheck <> m.RV          --- updates since last time procedure2 run
   OR m2.RVcheck IS NULL ;        --- inserts since  ...

FULL JOIN您可以使用 a并删除外键约束来检查删除。

于 2011-07-27T20:24:00.693 回答
2

我会在单独的表上使用二进制字段来保存最后一个 rowversion 值,并在表上放置一个后触发器来同步它们。然后加入这两个表并比较它们是否相同。

于 2011-07-27T19:23:10.037 回答