我有一个带有timestamp列的sql server表。有没有办法强制时间戳列更改而不实际更新记录?
我问的原因是因为我想在子表中插入/更新/删除记录时更改记录的时间戳。
时间戳可能不是执行此操作的最佳方式。如果没有,我该怎么办?我不想使用datetime,因为我觉得这不是一个很好的版本控制方式。我不想使用整数,因为我不想读取值来增加它。
建议?
答案 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=@foo
是set
之后的唯一子句。我正在使用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列进行版本控制。
我仍然对创意持开放态度。