2011-01-04 29 views
19

W mojej bazie danych mam kolumnę timestamp. Muszę zaktualizować wiersz w tabeli i zaktualizować kolumnę timestamp. Po uruchomieniu polecenia aktualizacji otrzymuję:Serwer SQL aktualizujący kolumnę znacznika czasu

Cannot update a timestamp column. 

Jak mogę zaktualizować kolumnę znacznika czasu?

Odpowiedz

28

ty nie

timestamp column is updated automatically. Być może masz wrażenie, że znacznik czasu zawiera wartość odnoszącą się do czasu? Nie jest, ale po prostu jest liczbą, która jest aktualizowana, gdy wartość w tym rekordzie jest. Pomyśl o tym jak o wersji rządowej.

Od MSDN: typ danych

Znacznik czasu jest tylko zwiększając ilość i nie zachować datę lub godzinę.

+9

Bardzo intuicyjny nazywanie go, czy to nie jest ....: P –

+1

@JacquesBosch - Zgadzam się, że jest to bardzo mylące –

2

Nie zaktualizować kolumny timestamp - znacznik czasu (teraz przemianowany rowversion) kolumna jest automatycznie aktualizowana przez serwer SQL, gdy jakakolwiek inna kolumna w wierszu jest aktualizowana.


Jeśli już to wiedziałeś, ale z jakiegoś powodu chcesz wymusić aktualizację kolumny, po prostu wykonaj aktualizację względem wiersza, którego dotyczy problem. Nawet jeśli prowadzi to bez faktycznej zmiany danych, kolumna timestamp będzie nadal aktualizować:

create table #T1 (
    ID int not null, 
    ts timestamp not null 
) 
insert into #T1 (ID) 
select 1 union all 
select 2 
select * from #T1 
update #T1 set ID = ID where ID=1 
select * from #T1 

ID ts 
1 0x0000000000039AAF 
2 0x0000000000039AB0 

ID ts 
1 0x0000000000039AB1 
2 0x0000000000039AB0 
2

Chociaż kopalnia nie jest odpowiedzią na pytanie chciałem wspomnieć jak TIMESTAMP może być źle zrozumiane.

W swoim pytaniu nie podajesz, że używasz kolumny TIMESTAMP, ale fakt, że próbujesz ją zaktualizować, implikuje (dla mnie), że próbujesz nagrywać, gdy zmieniają się twoje dane.

Spójrz na this article (jest też wiele innych w Internecie) dotyczących korzystania z TIMESTAMP, kiedy rzeczywiście chcesz nagrać zmianę za pomocą DATETIME.

BOL mówi:

SQL Server timestamp Typ danych nie ma nic wspólnego z czasami i datami. Znaczniki czasowe serwera SQL są liczbami binarnymi , które wskazują na względną sekwencję, w której modyfikacje danych miały miejsce w bazie danych. Typ danych znacznika czasu był pierwotnie wdrożony w celu obsługi algorytmów odzyskiwania SQL Server .

Jak Damien_The_Unbeliever mówi typ został przemianowany i opis mówi: typ danych

rowversion jest tylko zwiększając ilość i nie zachować datę lub godzinę.Aby zarejestrować datę lub godzinę , należy użyć typu danych datetime2: .

Oczywiście, jeśli używasz typ danych w sposób zamierzony ignorować wszystkie powyższe :)

+0

Nie można zapisać daty i czasu w kolumnie TIMESTAMP, więc nie ma się czym martwić. Myślę, że ta odpowiedź jest myląca. –

+1

@ m.edmondson: Masz rację, brzmienie mojej odpowiedzi jest trochę mylące. Nie wnioskowałem, że Sally próbowała umieścić wartość w datetime w kolumnie TIMESTAMP, tylko czasami ludzie są wprowadzani w błąd, myśląc, że TIMESTAMP zapewni automatyczny zapis momentu, w którym dokonano edycji, a następnie spróbuje wyodrębnić DATETIME wynika z danych. – Tony

1
kolumna

datownika nie mogą być aktualizowane, ponieważ jest serwer generowany jest gauranteed być unikalny dla całego baza danych - jeśli aktualizacje były dozwolone, a nie to, to wartość nie jest wyjątkowa.

Napotkałem ten sam problem, próbując zaktualizować kolumnę znacznika czasowego w replikowanej instancji, ponieważ replikowana instancja nie miała tej samej wartości znacznika czasu co wydawca - co spowodowało pewne problemy podczas próby uzyskania ostatnio zaktualizowanego rekordu dla grupy rekordów. oczywiście z replikacją była to prosta konfiguracja w wydawcy, aby umożliwić replikację tej samej wartości znacznika czasu subskrybentowi.

w przeciwnym razie nie ma innego sposobu na aktualizację wartości znacznika czasu.

0

miałem ten sam problem, moje rozwiązanie:

UPDATE [table] 
SET [ANY_COLUMN] = [ANY_COLUMN] 
WHERE ID = [ID] 

jakby w każdej chwili, gdy wartość stół zmienić znacznik czasu jest przeliczany, zaktualizować dowolną kolumnę do tej samej wartości dlatego znacznik czasu jest aktualizowany

Powiązane problemy