如何在不更改记录数据的情况下更新sql server timestamp列

时间:2010-01-29 21:37:19

标签: c# .net sql sql-server

我有一个带有timestamp列的sql server表。有没有办法强制时间戳列更改而不实际更新记录?

我问的原因是因为我想在子表中插入/更新/删除记录时更改记录的时间戳。

时间戳可能不是执行此操作的最佳方式。如果没有,我该怎么办?我不想使用datetime,因为我觉得这不是一个很好的版本控制方式。我不想使用整数,因为我不想读取值来增加它。

建议?

5 个答案:

答案 0 :(得分:9)

  

我不想使用整数,因为我不想读取值来增加它。

UPDATE Table SET
    IntColumn = IntColumn + 1

虽然技术上需要阅读,但我没有看到任何问题。

您可以随时更新为相同的值:

UPDATE Table SET
    SomeColumn = SomeColumn

也将触发rowversion更新。

附加:您可以使用子项的最大rowversion执行视图:

SELECT Parent.*, MaxChildRowVersion as ChildVersion
FROM Parent
JOIN (
    SELECT ParentId, MAX(RowVersion) as MaxChildRowVersion
    FROM Child
    GROUP BY ParentId
) as Child ON
     Parent.ParentId = Child.ParentId

但是,不,你不能直接更新rowversion列(虽然你可以使用@@ DBTS,binary(8)和INSTEAD OF触发器来实现你自己的可更新...)

  

你能举出你最后一点的例子吗?这听起来很有希望。

不,真的没有。 ;)当您可以更改为相同的值或使用视图时,这是太多的工作。这是2个最简单的选择。

但是,要完成,一个二进制(8)列,默认为@@ DBTS(返回数据库版本号),以及一个AFTER UPDATE触发器,它也将二进制列更新为新的@@ DBTS将给出你是一个psuedo-rowversion类型,然后你可以手动更新。它不会比仅仅将其他列更新为相同的值更快或更好。

答案 1 :(得分:4)

罗尼,

首先,Microsoft已弃用timestamp语法,因此您需要使用rowversion,其次rowversion始终与该行相关。

来自文档:

  

rowversion

     

每个数据库都有一个计数器,该计数器针对在数据库中包含 rowversion 列的表上执行的每个插入或更新操作递增。此计数器是数据库 rowversion

但是,因为它在SQL服务器中实现的方式,你需要使用触发器来实现你想要的。

这样的事情:

CREATE TRIGGER tgUpdateParentRowVersion ON ChildTable FOR INSERT, DELETE, UPDATE
AS
BEGIN
   /*
    * The updates below force the update of the parent table rowversion
    */
   UPDATE ParentTable
      SET ChildUpdate = ChildUpdate + 1
     FROM ParentTable a 
     JOIN inserted    i on a.pkParentTable = i.fkParentTable

   UPDATE ParentTable
      SET ChildUpdate = ChildUpdate - 1
     FROM ParentTable a 
     JOIN deleted     d on a.pkParentTable = d.fkParentTable
END

答案 2 :(得分:2)

信不信由你,这将更新RowVersion / Timestamp列,而无需设置列。注意@foo=@fooset之后的唯一子句。我正在使用Sql Server 2017。

declare @foo nvarchar(50);

update dbo.MyTable
set @foo = @foo
where Id = @id

答案 3 :(得分:1)

您是否考虑过使用triggers?它似乎更适合你所追求的目标。

我曾经在一个曾经有时间戳的应用程序上工作过;确切地说,我们应该用它们做的事情被证明是难以捉摸的,所以我们从模式中审核了它们。您可以根据数据读取您创建的对象的时间戳,并检查当您进行更新和回滚时它是否已更改,如果您发现数据是脏的,但这是一个很大的增益(在至少在我工作的领域。)

答案 4 :(得分:0)

在我想出更好的想法之前,我要做的是将DateTime列添加到名为DateChildrenChanged的父表中。

我将在子表上添加一个触发器,将DateChildrenChanged列设置为当前DateTime,当发生这种情况时,父表上的timestamp列也将更新。

这样我就使用timestamp列进行版本控制。

我仍然对创意持开放态度。