Cześć, mam problem jak poniżej. Zaznaczam, że niebywale zależy mi na optymalizacji.
Więc jest sobie tabela events.
Dla ułatwienia powiedzmy, że zawiera 3 pola: ID(klucz główny), spr i ignored.
Zaznaczam, że taka struktura jest tylko dla ułatwienia, w rzeczywistości wygląda inaczej i nie mogę zastosować klucza głównego na kilku kolumnach.
Teraz, jeśli robię insert do tej tabeli, muszę zorientować się, czy jest już taki rekord, który ma wartość w polu SPR taką samą, jak właśnie wstawiany. Jeśli ma, to wstawianemu rekordowi muszę ustawić pole ignored = 1, jeśli nie ma, to ignored = 0.
Myślałem nad użyciem triggerów, jednakże MSSQL 2005 niestety nie ma triggera BEFORE INSERT.
Więc zostaje mi AFTER INSERT lub INSETAD OF.
I teraz jeśli użyję AFTER INSERT to muszę znać ID wstawionego rekordu. Rozumiem, że z poziomu triggera mogę je pobrać za pomocą zmiennej @@IDENTITY, tak?
Następnie musiałbym wykonać update na tabeli events, żeby zmienić pole ignored.
Jeśli chciałbym użyć trigger insetad of, musiałbym stworzyć jeszcze jedną tabelę. Np: PRE_EVENTS i na tej tabeli założyć trigger.'
Teraz jeśli ktoś robi insert na PRE_EVENTS, porównuję go z zawartością tabeli events i robię insert do tabeli events z odpowiednią wartością pola IGNORED.
Rozwiązanie mojego problemu widzę właśnie w taki sposób.
Oczywiście mogę to zrobić w procedurze składowanej JAKOŚ(a i tak będę musiał taką procedurę napisać), tylko to się wiąże chyba ze sprawdzaniem każdego rekordu z każdym rekordem.
Procedurę muszę mieć po to, żeby móc wykonać operację w dowolnym momencie, nie tylko podczas insertu.
Tak więc pytanie jest następujące. Czy dobrze myślę? Która opcja triggera będzie lepsza? AFTER INSERT, czy INSTEAD OF?