Krzysztof Rynkiewicz

Krzysztof Rynkiewicz Student,
Politechnika Gdańska

Temat: Trigger problem

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 :)

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
Piotrek Damek

Piotrek Damek Programista, TX
System

Temat: Trigger problem

Cześć, ta tabela nie ma żadnego unikalnego klucza? Kolumny, które wymieniłeś to wszystko, co znajduje się w tej tabeli?
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Trigger problem

Nie jestem pewien czy dobrze rozumiem o co chodzi ale
1) Rozumiem że przed update masz jeszcze jakiś kod który sprawdza czy to duplikat czy nie? W update masz BETWEEN, nie bardzo rozumiem po co..

2) Jeśli możesz zmodyfikować tabelę, dodaj klucz główny. Wtedy upewniwszy się, że rekord to duplikat zrobisz update tylko na jednym ID.

3) Piszesz o 24h, więc rozumiem że @data to datetime a data wprowadzenia jest przynajmniej z dokładnością co do minuty. Jeśli nie możesz dodać klucza do tabeli to możesz zrobić update po kodzie i dacie - przy odpowiedniej precyzji zapisu czasu powinno to pozwolić zidentyfikować pojedyńczy rekord. Ale gwarancji nie masz, używałbym tylko jeśli masz pewność że częstotliwość insertów jest mała i tylko gdybym nie miał innego rozwiązania.

4) Zamiast AFTER INSERT możesz dać INSTEAD OF, jeśli w ustawieniach serwera wyłączysz opcję "Allow triggers to fire others". Wtedy sprawdzisz sobie czy rekord jest duplikatem zanim zostanie zapisany w tabeli, ustawisz odpowiednią wartość flagi 'duplikat' i wstawisz dopiero zrobisz insert.

5) To samo co w 4) ale bez zmiany ustawien serwera możesz osiągnąć sprawdzając na początku kodu czy to nie jest kolejny zagnieżdzony trigger przy użyciu TRIGGER_NESTLEVEL - wykonuj kod tylko jeśli to pierwszy trigger.

6) Twój trigger nie obsługuje wstawiania wielu wierszy, nie wiem czy takie jest założenie zadania, bo to może ale nie musi być problem.Bartosz Ślepowronski edytował(a) ten post dnia 20.07.10 o godzinie 20:59
Krzysztof Rynkiewicz

Krzysztof Rynkiewicz Student,
Politechnika Gdańska

Temat: Trigger problem

Ten trigger robię jako szkielet do bazy której jeszcze nie znam ( baza przemysłowa z tego co wiem klucz główny będzie tam przy dacie)

@1
Przyznam ze bylem przekonany ze linijka:
@kod=kod
sprawdza czy to duplikat, prosiłbym o rozwiniecie myśli :)

@6
Trigger ma sprawdzać dane z 24h ale ma edytować tylko nowo dodany pojedynczy rekord wiec chyba nie będzie z tym problemu

Dzięki za odpowiedzi i czekam na więcej, w międzyczasie pokombinuję :)

konto usunięte

Temat: Trigger problem

jak dodasz dwa rekordy ten triger zle zadziala. inserted to tabela wirtualna wiec bedzie miec wiele wierszt. pracuj blokowo joiny, te sprawy
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Trigger problem

Krzysztof Rynkiewicz:
Ten trigger robię jako szkielet do bazy której jeszcze nie znam ( baza przemysłowa z tego co wiem klucz główny będzie tam przy dacie)

Gdzie by nie był, ważne żeby był unikatowy :)
@1
Przyznam ze bylem przekonany ze linijka:
@kod=kod
sprawdza czy to duplikat, prosiłbym o rozwiniecie myśli :)

Sprawdza, ale jeśli jest w update to powoduje że zmieniana jest wartość wszystkich rekordów o tym samym kodzie. Rozumiem, że pierwszy rekord może mieć wartość 'duplikat' = 0 i nie powinna ona być zmieniana? Bo jeśli nie o to chodzi to nie rozumiem w czym jest problem :)

Sam bym najpierw sprawdził czy istnieją duplikaty i dopiero jeśli istnieją to zrobił update, ale nie na zakresie rekordów tylko po konkretnym ID.
@6
Trigger ma sprawdzać dane z 24h ale ma edytować tylko nowo dodany pojedynczy rekord wiec chyba nie będzie z tym problemu

Problem jest wtedy kiedy ten insert który odpala triggera może wstawić więcej niż jeden rekord na raz albo jeśli ktoś robi na przykład bulk insert do tej tabeli.
Krzysztof Rynkiewicz

Krzysztof Rynkiewicz Student,
Politechnika Gdańska

Temat: Trigger problem

Witam rozwiązałem problem takim oto kodem:

create trigger dbo.duplikaty
on dbo.glowna
after insert
AS
/*deklaracja zmiennych
@kod - wprowadzany kod
@data - wprowadzana data
@data1 - wprowadzana data minus 1 dzien
@dataIL - zliczona ilosc dat dla wprowadzonego kodu
*/
declare @kod int, @data datetime, @data1 datetime, @dataIL int
select @kod=inserted.kod from inserted
select @data=inserted.data from inserted
-- opóźnienie daty
set @data1=dateadd (d, -1, @data)
--zliczanie dat dla wprowadzonego kodu w przedziale od daty cofnietej o jeden dzień do daty wprowadzonej
select @dataIL=COUNT(data) from dbo.glowna
where (kod =@kod) and (data BETWEEN @data1 AND @data)
--ustawienie duplikatu dla dodanego rekordu pod warunkiem ze @dataIl>1 we wskazanym przedziale
update dbo.glowna
set duplikat=1 where data=@data
and @dataIL>1

Okazało się jednak ze ta przemysłowa baza danych zapisuje dane do pliku wiec trigger tu nie zadziała bo dane są już wyświetlane bezpośrednio z tych plików. Musze przerobić teraz ten kod tak żeby działał na widokach bądź tabelach i żeby wykonywał dana czynność oddzielnie dla każdego wiersza niestety nie mam pomysłu jak to zrobić :P

Pozdrawiam, z góry dzięki za odpowiedzi
Krzysztof Rynkiewicz

Krzysztof Rynkiewicz Student,
Politechnika Gdańska

Temat: Trigger problem

Zapomniałem dodać,że można to rozwiązać za pomocą makra w excelu, ale w VBA nie jestem kompletnie obyty.

PS Głupio się przyznać, ale nie widzę opcji edytuj posty gdzie ona jest ;d

konto usunięte

Temat: Trigger problem

Krzysztof Rynkiewicz:
Okazało się jednak ze ta przemysłowa baza danych zapisuje dane do pliku wiec trigger tu nie zadziała bo dane są już wyświetlane bezpośrednio z tych plików. Musze przerobić teraz ten kod tak żeby działał na widokach bądź tabelach i żeby wykonywał dana czynność oddzielnie dla każdego wiersza niestety nie mam pomysłu jak to zrobić :P

Pozdrawiam, z góry dzięki za odpowiedzi

bulk insert

konto usunięte

Temat: Trigger problem

Krzysztof Rynkiewicz:
Zapomniałem dodać,że można to rozwiązać za pomocą makra w excelu, ale w VBA nie jestem kompletnie obyty.

PS Głupio się przyznać, ale nie widzę opcji edytuj posty gdzie ona jest ;d

http://vbamania.blogspot.com/

poczytaj tagi sql, vba
Krzysztof Rynkiewicz

Krzysztof Rynkiewicz Student,
Politechnika Gdańska

Temat: Trigger problem

nie da rady bez zastosowania bulka?

konto usunięte

Temat: Trigger problem

Krzysztof Rynkiewicz:
nie da rady bez zastosowania bulka?

openrowset / opeenquery w zależności jakie masz uprawnienia



Wyślij zaproszenie do