Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z triggerem w MySQL
parzol
post
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:

  1. mysql> CREATE TRIGGER room_reservation_bi AFTER INSERT ON room_reservation FOR EACH ROW SET NEW.reservation_number = CONCAT_WS('/', NEW.id, MONTH(NOW()), YEAR(NOW()));


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
artega
post
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:
  1. CREATE TRIGGER room_reservation_bi BEFORE INSERT ON room_reservation FOR EACH ROW SET NEW.reservation_number = CONCAT_WS('/', LAST_INSERT_ID()+1, MONTH(NOW()), YEAR(NOW()))
Go to the top of the page
+Quote Post
woj_tas
post
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
Go to the top of the page
+Quote Post
parzol
post
Post #4





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

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


Cytat(artega @ 28.06.2008, 07:15:50 ) *
Jak widać MySQL nie zezwala na aktualizacje nowego rekordu w wyzwalaczu uruchamianym po wprowadzeniu danych. Rozwiązanie może być takie:
  1. CREATE TRIGGER room_reservation_bi BEFORE INSERT ON room_reservation FOR EACH ROW SET NEW.reservation_number = CONCAT_WS('/', LAST_INSERT_ID()+1, MONTH(NOW()), YEAR(NOW()))



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)

Cytat(woj_tas @ 28.06.2008, 08:52:39 ) *
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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.12.2025 - 20:24