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: