Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%)
|
Witam.
To mój pierwszy kontakt z triggerami więc proszę o wyrozumiałość (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Mój kod:
I dostaję błąd: ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger Chciałem aby po dodaniu nowej rezerwacji do tabeli dla danej rezerwacji pole reservation_number mialo postac: 1/6/2008 czyli najpierw ID rekordu w tabeli potem miesiąc aktualny i rok. Co robię zle? (IMG:http://forum.php.pl/style_emoticons/default/sciana.gif) Ten sam problem: Link |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 174 Pomógł: 42 Dołączył: 22.07.2007 Skąd: /dev/random Ostrzeżenie: (0%)
|
Jak widać MySQL nie zezwala na aktualizacje nowego rekordu w wyzwalaczu uruchamianym po wprowadzeniu danych. Rozwiązanie może być takie:
|
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 230 Pomógł: 36 Dołączył: 31.03.2006 Skąd: Zielona Góra Ostrzeżenie: (0%)
|
W oraclu problem ten nazywa się "Mutujące tablice" (mutating tables) i występuję tylko w przypadku trigerów wierszowych (row level triggers), czyli tych zawierających opcję FOR EACH ROW. Jeżeli przekształcisz wyzwalacz wierszowy (row triggers) w wyzwalacz poleceniowy (statement
triggers) powinno zadziałać. Niestety nie będziesz miał wtedy dostępu do zmiennych NEW i OLD. Dotyczy to Oracla, myślę jednak że w MySql jedst podobnie. Pozdrawiam |
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%)
|
Jak widać MySQL nie zezwala na aktualizacje nowego rekordu w wyzwalaczu uruchamianym po wprowadzeniu danych. Rozwiązanie może być takie:
Po pierwsze LAST_INSERT_ID() jest niebezpieczne bo co jesli w tym samym czasie gdzie indziej w bazie zostanie dodany ID? Po drugie jaki to ma sens z BEFORE? Skoro chce dodac nadany ID to skad on go ma wziasc przed insertem? (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif) W oraclu problem ten nazywa się "Mutujące tablice" (mutating tables) i występuję tylko w przypadku trigerów wierszowych (row level triggers), czyli tych zawierających opcję FOR EACH ROW. Jeżeli przekształcisz wyzwalacz wierszowy (row triggers) w wyzwalacz poleceniowy (statement triggers) powinno zadziałać. Niestety nie będziesz miał wtedy dostępu do zmiennych NEW i OLD. Dotyczy to Oracla, myślę jednak że w MySql jedst podobnie. Pozdrawiam I to by się zgadzało (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Problem w tym że to co możliwe w Oracle niestety nie jest możliwe w pseudo bazie jaką jest niestety MySQL (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) Link Ten post edytował parzol 28.06.2008, 12:22:01 |
|
|
|
![]() ![]() |
|
Aktualny czas: 23.12.2025 - 20:24 |