Typ Timestamp zaimplementowany w MS SQL Server jest binarnym 8 bajtowym typem danych reprezentowanym w trybie heksadecymalnym (HEX). Typ ten zawiera unikalne w ramach całej bazy danych i tabel znaczniki wierszy.

Jego nazwa jest dość niefortunna, gdyż nie ma on nic wspólnego z datą i czasem.

 

(Czasem jest mylony z UNIXowym timestampem). Wg Microsoftu typ ten ma być „deprecated„.

 

Zamiennie należy używać synonimu ROWVERSION, którego nazwa w pełni odzwierciedla jego typ.

 

Zadaniem Rowversion jest wersjonowanie rekordów (wierszy) oraz kontrola kolejności, w jakiej rekordy były dodawane i/lub modyfikowane w ramach tabeli lub całej bazy danych.

 

Przy okazji mylącego nazewnictwa należy zwrócić uwagę na funkcję CURRENT_TIMESTAMP. Funkcja ta jest aliasem funkcji GETDATE()  i nie ma nic wspólnego z typem timestamp.

 

Podstawowe cechy ROWVERSION:

 

  • Synonim TIMESTAMP, którego nazewnictwo jest mylące.
  • Wg Microsoftu TIMESTAMP jest „deprecated” czyli  przestarzały, a co za tym sie kryje to to, że w kolejnych wersjach MS SQL Server może zostać on usunięty.
  • Typ binarny o długości 8 bajtów w reprezentacji heksadecymalnej.
  • W ramach jednej tabeli może wystąpić tylko jedna kolumna z typem ROWVERSION
  • Przechowuje informacje w jakiej kolejności wiersze były wstawiane i/lub modyfikowane w bazie i tabeli.
  • Zawartość ROWVERSION można przekopiować do kolumny typu VARBINARY
  • Wartość ROWVERSION jest wartością wyliczaną i nie można jej wstawić do pola ręcznie Sposobem na przekopiowanie zawartości kolumny jest przez zastosowanie SELECT … INTO …., ale nie zaleca się używania rowversion w ten sposób.
  • Przy pomocy funkcji skalarnej @@DBTS można zwrócić wartość, która jako ostatnia została wstawiona do kolumny typu ROWVERSION w bieżącej bazie danych. Po usunięciu wiersza i dodaniu nowego wartość ROWVERSION będzie inna.

Przykłady użycia:

 

Jeżeli nie podamy nazwy kolumny nazwa ta sama zostanie ustawiona na [timestamp].

(Dotyczy wyłącznie timestamp)


<div></div>
CREATE TABLE dbo.ExampleTable
      (
         PriKey int PRIMARY KEY
       , timestamp
      )
GO

 

Przykład z użyciem ROWVERSION. W tym wypadku podajemy nazwę kolumny.

CREATE TABLE dbo.ExampleTable2
      (  PriKey int PRIMARY KEY
       , VerCol rowversion
      )
GO

Powyższa składnia dotyczy to również ALTER TABLE

 

 

@@DBTS

 

Skalarna funkcja konfiguracyjna zwracająca ostatnio użytą wartość timestamp (rowversion) z aktualnej bazy. Wartość zwracana jest typy varbinary. Nowa wartość timestamp jest generowana w momencie dodania lub zmiany wartości w wierszu.

 

Przykład użycia @@DBTS

USE AdventureWorks2008R2;
GO
SELECT @@dbts AS 'Rowversion current value';
GO

 

W odpowiedzi uzyskamy następujący wynik:

Rowversion currentvalue
------------------------
0x00000000000009F2
(1 row(s) affected)

 

Przykład użycia ROWVERSION:

CREATE TABLE dbo.Foo
   (
      ID INT NOT NULL IDENTITY(1,1)
     ,FOODATE DATETIME NOT NULL
     ,FOOSTAMP ROWVERSION
   );
GO
INSERT INTO FOO (FOODATE) VALUES ('October 10, 2005');
INSERT INTO FOO (FOODATE) VALUES ('November 10, 2005 10:01:01');
INSERT INTO FOO (FOODATE) VALUES ('December 6, 2005 11:01:01');
INSERT INTO FOO (FOODATE) VALUES ('January 5, 2006');
INSERT INTO FOO (FOODATE) VALUES ('02/07/2006');
INSERT INTO FOO (FOODATE) VALUES ('03/08/2006 14:01:01');
INSERT INTO FOO (FOODATE) VALUES ('04/06/2006 15:01:01');
INSERT INTO FOO (FOODATE) VALUES ('20060504');
INSERT INTO FOO (FOODATE) VALUES ('20060606 17:01:01');
INSERT INTO FOO (FOODATE) VALUES ('20060706 19:01:01');
GO
SELECT ID
     , FOOdate FOO
     , FOOstamp AS Stamp
FROM dbo.FOO;
GO

 

W odpowiedzi dostanie następujący wynik:

ID FOO Stamp <br>---------------------------------------------
 1 2005-10-10 00:00:00.000 0x0000000000000FA2
 2 2005-11-10 10:01:01.000 0x0000000000000FA3
 3 2005-12-06 11:01:01.000 0x0000000000000FA4
 4 2006-01-05 00:00:00.000 0x0000000000000FA5
 5 2006-02-07 00:00:00.000 0x0000000000000FA6
 6 2006-03-08 14:01:01.000 0x0000000000000FA7
 7 2006-04-06 15:01:01.000 0x0000000000000FA8
 8 2006-05-04 00:00:00.000 0x0000000000000FA9
 9 2006-06-06 17:01:01.000 0x0000000000000FAA
10 2006-07-06 19:01:01.000 0x0000000000000FAB
(10 row(s) affected)

 

Linki:


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl