Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z Trigger'em
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
Niktoś
Nie za wiele działałem z triggerami i mam problem.
Ułożyłem takiego triggera:
  1. CREATE TRIGGER tr_UpdTabele
  2. ON Platnosci
  3. AFTER UPDATE
  4. AS
  5.  
  6. IF NOT UPDATE(zaplacono)
  7. RETURN
  8.  
  9. IF EXISTS (SELECT *
  10. FROM inserted a
  11. JOIN deleted b ON a.IdPlat=b.IdPlat
  12. WHERE b.zaplacono <> 1 AND
  13. a.zaplacono = 1)
  14. BEGIN
  15. DECLARE @NazwaSklepu nvarchar(50);
  16. DECLARE @NazProduktu nvarchar(50);
  17. Declare @TypSklepu nvarchar(50);
  18. Declare @Suma int;
  19.  
  20.  
  21. SET @TypSklepu=(SELECT t.TypSklepu
  22. FROM inserted a
  23. JOIN deleted b ON a.IdPlat=b.IdPlat JOIN Finanse t ON t.IDkl=a.IdKl AND t.IdKlient=a.numtKlienta
  24. WHERE b.zaplacono <> 1 AND
  25. a.zaplacono = 1)
  26. SET @NazProduktu=(SELECT t.NazwaTowaru
  27. FROM inserted a
  28. JOIN deleted b ON a.IdPlat=b.IdPlat JOIN Finanse t ON t.IDkl=a.IdKl AND t.IdKlient=a.numtKlienta
  29. WHERE b.zaplacono <> 1 AND
  30. a.zaplacono = 1)
  31. SET @Suma=( SELECT SUM(t.Ilosc) FROM Finanse t JOIN inserted f ON t.IDkl=f.IdKl AND t.IdKlient=f.numtKlienta WHERE t.NazwaTowaru=@NazProduktu AND f.zaplacono=1 GROUP BY t.NazwaTowaru)
  32. UPDATE [@TypSklepu] SET iloscSprzedanych=iloscSprzedanych+@Suma WHERE NazwaProduktu=@NazProduktu;
  33. END
  34. go


Trigger ma za zadanie zrobić update na danej tabli ,kiedy zostaje wykonany update na tabeli gdzie ustawiony jest ten triger.
Po dokonaniu płatności do tabeli płatności updatowana jest kolumna zaplacono(ustawiony status).
tabela jest powiązana z tabelą finanse ,gdzie są nazwy sklepu,przedmiotu, ilość zakupionych produktów,a ta zkolei powiązana jest z tabelą klient(to chyba mało ważne).Ważne są te dwie tabele finanse i płatności.
Po updatowaniu chciałem użyć wyzwalacza który by zliczył ilość wszystkich zakupionych przedmiotów o konkretnej nazwie ze statusem zakupiono i updatować całkiem inną /inne tabele [@TypSklepu].Użyłem parametru bo przedmioty mogą znajdować się w różnych tabelach o tej samej strukturze.
Tymczasem wyskoczyło mi internal server error (500).

Nie wiem czy w ogóle mogę tu użyć triggera. Wygląda to tak- dokonuje zakupu przykładowo rower,rolki,piłka zapisują się w tabeli finanse zaś wszelkie dane adresowe do tabeli klient, w osobnej tabeli płatności zapisuje się status.Te trzy tabele są w mniejszym lub większym stopniu ze sobą powiązane. Teraz dokonuję zapłaty za przedmiot i updatuje tabele płatności i bezpośredni w tabeli finanse dla każdego przedmiotu muszę zliczyć/sumować liczbę wszystkich które zostały zakupione.Nie mam pojęcia jak to fajnie rozwiązać, dlatego proszę o radę.Czy triger do tego się nadaje?
Firebright
Jeszcze nigdy nie widziałem takiej konstrukcji UPDATE [@zmienna] SET...
Być może żyje w nieświadomości ale na 99% właśnie to jest powodem twoich problemów, spróbuj zmienić tego update na coś takiego:
  1. DECLARE @sql varchar(4000)
  2. SET @sql = 'UPDATE ' + @TypSklepu + ' SET iloscSprzedanych=iloscSprzedanych+ ' + @Suma + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'
  3. EXEC sp_executesql @sql

Więcej na ten temat znajdziesz w Google pod hasłem "MSSQL dynamic SQL".

Dodatkowo nie musisz pisać odrębnych SET'ów dla takich samych zapytań, spróbuj:
  1. SELECT @TypSklepu = t.TypSklepu, @NazProduktu = t.NazwaTowaru
  2. FROM inserted a
  3. JOIN deleted b ON a.IdPlat=b.IdPlat JOIN Finanse t ON t.IDkl=a.IdKl AND t.IdKlient=a.numtKlienta
  4. WHERE b.zaplacono <> 1 AND
  5. a.zaplacono = 1


Powodzenia smile.gif.
Niktoś
Witaj twoje rozwiązanie wydaje się być lepsze, jednakże również nie działa.

Cytat
DECLARE @sql varchar(4000)

SET @sql = 'UPDATE ' + @TypSklepu + ' SET iloscSprzedanych=iloscSprzedanych+ ' + @Suma + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'

EXEC sp_executesql @sql


Poczytałem trochę o EXEC() i o sp_executesql () i jak dobrze przeczytałem to wspiera typy tekstowe tylko (EXEC(8000)znaków-EXEC sp_executesql(4000).Tak więc wykonywanie pogrubionej u góry arytmetyki nie jest możliwe ze względu na niezgodność typów- wywala błąd o niemożliwości konwersji nvarchar na int.

  1. SET @sql = 'UPDATE ' + @TypSklepu + ' SET iloscSprzedanych=iloscSprzedanych+ ' + cast(@Suma AS nvarchar(50)) + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'
jednakże sama kolumna iloscSprzedanych jest typu liczbowego.
Błędu nie wysypuje lecz nic się nie dzieje ,w ogóle nie updatuje sad.gif.
Hmm.Nie wiem już co może być nie tak, normalnie zgłupiałem.
Firebright
Jasne, masz rację, niestety już od dość dawna nie mam styczności z MSSQL i takie szczegóły się zacierają sad.gif.
Spróbuj tak, to powinno już problem rozwiązać:
  1. DECLARE @sql nvarchar(4000)
  2.  
  3. DECLARE @vSuma varchar(256)
  4. SET @vSuma = CAST(@Suma AS nvarchar(50))
  5.  
  6. SET @sql = 'UPDATE ' + @TypSklepu + ' SET iloscSprzedanych=iloscSprzedanych+ ' + @vSuma + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'
  7.  
  8. EXEC sp_executesql @sql


Daj znać jak poszło.
Niktoś
Niestety coś nie działa, nie ma błedów lecz nie updatuje. Nie mogę znaleźć przyczyny tego powodu.Próbowałem jeszce kombinować ze złączeniami join usuwać pojedynczo lecz bez powodzenia.Być może przyczyną jest ,że nie znajduje żadnego rekordu, a że kolumna jest typu int to updatuje stary rekord w którym jest default 0, a więc updatuje to samo.
Cieżko wogóle stwierdzić , czy triger wykonuje polecenie lub nie.Spróbuje jeszce dodać qwerende z poleceniem is null i updatować do wartości 1 i zobaczyć czy triger wogóle działa.

Miej więcej wiem gdzie leży błąd ,tylko nie umiem z nim sobie poradzić:
Cytat
DECLARE @sql nvarchar(4000)

DECLARE @vSuma varchar(256)
SET @vSuma = CAST(@Suma AS nvarchar(50))

SET @sql = 'UPDATE [' + @TypSklepu + '] SET iloscSprzedanych=iloscSprzedanych+ ' + @vSuma + ' WHERE NazwaProduktu= ' + @NazProduktu + ';'

EXEC sp_executesql @sql


loscSprzedanych- musiałem zmienić typ kolumny z int na nvarchar aby updatowało- dodatkowo-wykonanie dodawania na tej samej kolumnie loscSprzedanych=iloscSprzedanych+ ' + @vSuma chyba nie zadziała dla typu nvarchar-nie wiem jak to rozwiązac.
Kolejny problem NazwaProduktu= ' + @NazProduktu + ';' - błąd inwalid kolumn name konik- z tym to już nie wiem o co chodzi , @NazProduktu="konik" ,który jest nazwą produktu(wartością), a nie nazwą kolumny.
Innymi słowy ,trigger updatuje do tak skonstruowanej kwerendy:
  1. SET @sql = 'UPDATE [' + @TypSklepu + '] SET iloscSprzedanych= ' + @vSuma + ';'


Tego chyba nie da rady zrobić w triggerze nie mogę znaleźć chocby jednego przykładu, hmm może z tego triggera przekazać parametry do funkcji i tam zrobić upload. Może ktoś ma jakieś wskazówki?
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.