Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger problem
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
Songok
Witam jestem na praktykach i mam pewne zadanie do wykonania jednak mecze sie z nim już dość długo i chyba jednak będę potrzebował pomocy smile.gif

Mianowicie posiadam Tabele z danymi:
data - datetime
kod - int
duplikat - int

Problem jest taki żeby trigger po wprowadzaniu nowego rekordu ustawiał w nim duplikat = 1 gdy w przeciągu ostatnich 24h pojawił się już dany kod.

napisałem coś takiego:
create trigger dbo.duplikaty
on dbo.glowna
after insert
AS
/*deklaracja zmiennych
@kod - wprowadzany kod
@data - wprowadzana data
@data1 - wprowadzana data minus 1 dzien
*/
declare @kod int, @data datetime, @data1 datetime
select @kod=inserted.kod from inserted
select @data=inserted.data from inserted
set @data1=dateadd(d, -1, @data)

/* wyszukanie duplikatow kodu dla zakresu 24h wstecz
*/

update dbo.glowna
set duplikat = 1
where @kod=kod
and Data BETWEEN CONVERT(DATETIME, @data1, 102) AND CONVERT(DATETIME, @data, 102)

Niestety ten trigger nie działa tak jakbym chciał mianowicie jako ze duplikat zmieniany jest po wprowadzeniu danych pierwszy rekord automatycznie jest duplikatem a tego nie chce i druga sprawa trigger stosuje sie do wszystkich danych na danym przedziale a nie tylko do nowo dodanego rekordu.

Problem muszę jakoś rozwiązać nie musi to być trigger może źle się za to zabrałem? Pozdrawiam i z góry dziękuje za pomoc
trafas
Witam,

Dwie zmiany w trigerze załatwią problem:

w zapytaniu na update danych:

  1. UPDATE dbo.glowna
  2. SET duplikat = 1
  3. WHERE @kod=kod
  4. AND DATA BETWEEN CONVERT(DATETIME, @data1, 102) AND CONVERT(DATETIME, @DATA, 102)
  5. AND (SELECT count(*) FROM glowna WHERE @kod=kod) > 1
  6. AND DATA = (SELECT max(DATA) FROM glowna WHERE @kod=kod)



Rozwiązanie pierwszego problemu:

-- warunek na to, czy w bazie jest więcej niż jeden rekord o danym kodzie
and (select count(*) from glowna where @kod=kod) > 1


Rozwiązanie drugiego problemu:
-- pobranie wiersza z najświeższą datą
and data = (select max(data) from glowna where @kod=kod)

Pozdrawiwam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.