2015-02-24 13 views
5

Stworzyłem tabelę historii produktów, dla której chcę automatycznie zwiększyć VersionId podzieloną na partycje przez ItemId.Czy można podać pod-sekwencję dla tabeli?

ID  ItemId  VersionId  ItemContent  Created 
1   1    1    fooo    2015-02-24 12:54:00.11 
2   2    1    barr    2015-02-24 12:54:15.35 
3   1    2    foo    2015-02-24 12:55:00.61 
4   1    3    baz    2015-02-24 12:55:45.23 
5   2    2    bar    2015-02-24 12:56:00.03

Obecnie ustawiono VersionId w wyzwalaczu. Co chciałbym znaleźć coś takiego (wiem, to w rzeczywistości nie działa):

create table ItemHistory 
(
    Id int identity(1,1) not null primary key 
    ,ItemId int not null references Item(Id) 
    ,VersionId int not null default row_number() over (partition by ItemId order by Id) 
    ,ItemContent varchar(max) 
    ,Created datetime not null default getdate() 
)

Chociaż mam roztwór roboczy, chciałbym wiedzieć, czy jestem brakuje niektórych wbudowanych -w funkcji obsługi tego przypadku.

+0

Więc mówisz, że podczas pisania wiersza do tabeli będzie określać ItemId i chcesz, aby identyfikator VersionId był ustawiony automatycznie na podstawie wierszy już w tabeli? – Elliveny

+0

@ Elliveny Tak, zgadza się. –

+0

Myślę, że wyzwalacz jest tutaj. Nie znam lepszego rozwiązania. Rozważmy pytanie, chciałbym zobaczyć, czy ktoś coś wymyśli! – Elliveny

Odpowiedz

2

W przypadku, gdy chcesz użyć mój komentarz jako odpowiedź

Dlaczego nie po prostu zrób to z myślą? W widoku możesz mieć wartość row_number().

Z indeksem na ItemId, Id powinien być bardzo szybki.
Prawdopodobnie mniej narzut niż wyzwalacz.

Widzę, że dodano komentarz jako przeczytany. Jeszcze więcej powodów do oglądania.

+0

Podczas gdy na pewno lepiej niż spust, myślę, że miałem nadzieję na jakąś nową gorączkę, tj .: parted sequenece jako domyślne ograniczenie. – canon

+1

Identyfikator FK, że sekwencje dla każdego FK będą słodkie. – Paparazzi

+0

Zgadzam się .. może być potrzebna nowa gorączka. Partycjonowane sekwencje brzmią niesamowicie. – whardier