Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Triggery (wyzwalacze), Warunek IF zalezny od wartości w innej tabeli, przerywanie ich działan
djgrin
post 4.06.2007, 08:44:59
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 13.05.2007

Ostrzeżenie: (0%)
-----


Czesc!
Wytlumacze swoj problem na przykladzie: mam tabele z danymi pracownikow oraz z urlopami, ktore biora pracownicy. Napisalem sobie triggera, ktory po dodaniu czegos do tabeli Urlopy (after insert), odejmuje ilosc pozostalego urlopu dla danego pracownika z tabeli Pracownicy. Tyle, ze dziala on w ten sposob, ze mozna dodawac urlopy w nieskonczonosc, czyli powodowac ujemne wartosci w polu IloscUrlopu w tabeli Pracownicy. Chcialbym to zmienic - mam dwa pomysly: pierwszy jest taki, ze w triggerze, ktory napisalem uwarunkuje wykonanie sie wszystkiego od zawartosci pola IloscUrlopu w tabeli Pracownicy dla danego pracownika, a drugi taki, ze napisze nowego triggera "before update on Pracownicy", ktory sprawdzi wartosc pola IloscUrlopu danego pracownika i jesli bedzie za mala, to przerwie zmiane wartosci (+ np. usunie wpis z tabeli Urlopy).
Jak sadzicie, ktora opcja jest lepsza (chyba, ze macie jakies inne pomysly) i jak takie cos napisac?
Prosze o szybka odpowiedz, dzieki z gory.
Go to the top of the page
+Quote Post
prond
post 4.06.2007, 11:54:43
Post #2





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Moim zdaniem trigger najlepiej pasuje przypiąć do tabeli urlopy, przed insertem.
Sprawdzasz wtedy w tabelce pracownicy, czy pracownik ma jeszcze dostatecznie duzo dni urlopu.
Jak nie ma to anulujesz inserta - to jest lepsze niz kasowanie (o ktorym napisales) poniewaz informujesz aplikacje, ze nie dalo sie dodac urlopu.


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
djgrin
post 4.06.2007, 14:46:12
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 13.05.2007

Ostrzeżenie: (0%)
-----


No zgadza sie, jest to lepsze rozwiazanie (pisalem tego posta bardzo szybko i teraz widze, ze odbilo sie to na jakosci mojej wypowiedzi winksmiley.jpg). W kazdym razie - jak takiego inserta anulowac w triggerze? Domyslam sie, ze chodzi o anulowanie transakcji, ale gdybym zobaczyl to na jakims przykladzie, bylbym bardzo wdzieczny winksmiley.jpg.
Dzieki za odpowiedz winksmiley.jpg
Go to the top of the page
+Quote Post
SongoQ
post 4.06.2007, 14:52:27
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Nie przygladalem sie triggerom w MySQLu ale adektwanie bedzie jak w innych bazach, wystarczy ze zwrocisz false, null w triggerze i rekord nie zostanie dodany, jesli zwracasz NEW czy OLD to operacja dochodzi do skutku.


--------------------
Go to the top of the page
+Quote Post
djgrin
post 4.06.2007, 22:06:02
Post #5





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 13.05.2007

Ostrzeżenie: (0%)
-----


Ok, wymyslilem to czego szukalem. Okazalo sie, ze jedynym sposobem na anulowanie transakcji w triggerze jest spowodowanie jakiegos bledu, np. odwolanie sie do nieistniejacej kolumny w tabeli (tabela musi istniec, inaczej blad bedzie za kazdym razem wyskakiwal). Wykorzystalem przy tym fakt, ze w komunikacie o bledzie pojawi sie nazwa tej kolumny, a moj trigger prezentuje sie nastepujaco:

  1. delimiter |
  2. CREATE TRIGGER tgr_urlopy
  3. after INSERT ON urlopy
  4. FOR each row
  5. begin declare zmienna INT;
  6. IF (SELECT IloscUrlopu FROM umprac WHERE IdUmowa=new.IdUmowa)>=(datediff(new.OkresDo, new.OkresOd)+1) then
  7. IF new.IdUrlopu='01' then
  8. UPDATE umprac SET IloscUrlopu=IloscUrlopu-datediff(new.OkresDo, new.OkresOd)-1 WHERE IdUmowa=new.IdUmowa;
  9. end IF;
  10. else SELECT `Pracownik posiada za malo urlopu!` FROM kadry INTO zmienna; end IF;
  11. end;|

Coz, mam nadzieje, ze komus to sie przyda winksmiley.jpg...
Pozdrawiam.

Ten post edytował djgrin 4.06.2007, 23:18:32
Go to the top of the page
+Quote Post
SongoQ
post 4.06.2007, 23:55:52
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Sprawdz to co pisalem wczesniej. Jesli stosujesz trigger przed dodaniem rekordu i z triggera zamiast return NEW zwrocisz false czy doda rekord. Jesli takie cos zadziala to problem masz rozwiazany i nie trzeba z bledem kombinowac.

Sprawdz to niestety w manualu czegos takiego sie nie doszukalem co w cale nie jest powiedziane ze nie istnieje.


--------------------
Go to the top of the page
+Quote Post
djgrin
post 5.06.2007, 06:58:06
Post #7





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 13.05.2007

Ostrzeżenie: (0%)
-----


Niestety trzeba "kombinowac z bledem", bo nie ma czegos takiego jak "return new", czy "return" w ogole w triggerach w tym systemie (stad te braki w manualu). A pomysl z bledem nie jest niestety moj:
http://www.brokenbuild.com/blog/2006/08/15...with-a-trigger/

Pozdrawiam.
Go to the top of the page
+Quote Post
SongoQ
post 5.06.2007, 07:52:07
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Dobrze wiedziec na przyszlosc. Pewnie kiedys wprowadza.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 02:25