Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger AFTER INSERT OR UPDATE OR DELETE
Forum PHP.pl > Forum > Bazy danych > MySQL
phpion
Witam ponownie smile.gif
Tym razem mam problem z utworzeniem triggera. Przewertowałem sporą część linków dotyczących tworzenia triggerów ale za Chiny nie mogę sobie poradzić z małą pierdołą. Chciałbym aby trigger był odpalany po wpisaniu, modyfikacji lub usunięciu danych z tabeli. W związku z czym napisałem:
  1. DELIMITER |
  2. CREATE TRIGGER update_category_items_t AFTER INSERT OR UPDATE OR DELETE ON card_category FOR EACH ROW
  3. BEGIN END|
  4. DELIMITER ;

co kończy się błędem:
Cytat
Script line: 21 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OR UPDATE OR DELETE ON card_category FOR EACH ROW
BEGIN

END' at line 1

O co chodzi? Próbowałem również magicznych konstrukcji (gdzieś znalazłem taki przykład) z:
  1. ... AFTER INSERT ON card_category OR UPDATE ON card_category ...

oraz:
  1. ... AFTER INSERT OR AFTER UPDATE OR AFTER DELETE ...

co również nie działa.

Moja wersja MySQL to 5.0.27.

Pozdrawiam,
pion

// EDIT:
Jest jeszcze ciekawsze zjawisko! Na razie chciałem utworzyć 3 osobne triggery, w związku z czym zrobiłem to tak:
  1. DROP TRIGGER update_category_items_tai;
  2. DROP TRIGGER update_category_items_tau; -- linia 19
  3. DROP TRIGGER update_category_items_tad; -- linia 20
  4.  
  5. DELIMITER |
  6. CREATE TRIGGER update_category_items_tai AFTER INSERT ON card_category FOR EACH ROW
  7. BEGIN CALL update_category_items (NEW.category_id);
  8. END|
  9.  
  10. CREATE TRIGGER update_category_items_tau AFTER UPDATE ON card_category FOR EACH ROW -- linia 28
  11. BEGIN CALL update_category_items (OLD.category_id);
  12. CALL update_category_items (NEW.category_id);
  13. END|
  14.  
  15. CREATE TRIGGER update_category_items_tad AFTER DELETE ON card_category FOR EACH ROW -- linia 34
  16. BEGIN CALL update_category_items (OLD.category_id);
  17. END|
  18. DELIMITER ;

Wywołaniem powyższego kodu skutkuje w:
Cytat
Script line: 19 Trigger does not exist
Script line: 20 Trigger does not exist
Script line: 28 Trigger already exists
Script line: 34 Trigger already exists

Nie rozumiem tu czegoś: dlaczego najpierw wypisywane jest, że trigger nie istnieje, a później, że już istnieje? W rezultacie zawsze dodawany jest tylko pierwszy trigger czyli update_category_items_tai.

Co robię źle? worriedsmiley.gif
tommy4
spotkałem się kiedyś z dziwnym też problemem, że w nazwie nie może być za dużo znaków '_'. Spróbuj nazwać triggery inaczej. To jedyne co przychodzi mi do głowy.

Bo z tego co widzę wszystkie 3 triggery:

update_category_items_tai
update_category_items_tau
update_category_items_tad

system widzi jako jeden.
phpion
Niestety nadal to samo :| Ogólnie to wielka kupa, że nie można dać po prostu AFTER INSERT OR UPDATE OR DELETE *... Może ktoś jeszcze będzie miał jakieś pomysły?

Cytat
Bo z tego co widzę wszystkie 3 triggery:

update_category_items_tai
update_category_items_tau
update_category_items_tad

system widzi jako jeden.

Dałem nazwy t1, r2, e3 i to samo...

* za http://www.brainbell.com/tutorials/MySQL/C...ng_Triggers.htm
Cytat
A single trigger cannot be associated with multiple events or multiple tables, so if you need a trigger to be executed for both INSERT and UPDATE operations, you'll need to define two triggers.


// EDIT:
Wygląda na to, że pozamiatane:
http://lists.mysql.com/commits/8316
Cytat
We don't allow creation of several triggers of the same type yet

W takim razie takie triggery to sobie można wsadzić...
slawcio
siema
1. masz starą wersje mysql
2. triggery weszły bodajże od wersji 5.0.34
3. z tego co wiem nie da sie utworzyć triggera który jednoczesnie działa na insert, update i delete (ale tego nie jestem pewien)
4. pozdrawiam
phpion
Cytat(slawcio @ 23.06.2008, 20:26:59 ) *
1. masz starą wersje mysql

No idealnie świeża to ona nie jest ale na serwerze i tak jest starsza.

Cytat(slawcio @ 23.06.2008, 20:26:59 ) *
2. triggery weszły bodajże od wersji 5.0.34

Nie, dostępne są od wersji 5.0.2.

Cytat(slawcio @ 23.06.2008, 20:26:59 ) *
3. z tego co wiem nie da sie utworzyć triggera który jednoczesnie działa na insert, update i delete (ale tego nie jestem pewien)

No właśnie się nie da. *

Cytat(slawcio @ 23.06.2008, 20:26:59 ) *
4. pozdrawiam

Ja również smile.gif

* finalnie projekt powstaje na PostgreSQL, w którym to nie ma najmniejszych problemów z triggerami.
slawcio
na 100 % masz za stara wersję MySQL, bo też długo spędziliśmy czasu zanim obczailiśmy dlaczego nam nie działa, a mieliśmy podobny problem...
... i jeszcze raz pozdrawiam
phpion
Ok, pewnie masz rację, ale (jak już pisałem) na serwerze i tak jest dostępna jeszcze starsza wersja (5.0.22) więc to i tak nie miałoby sensu. Co nie zmienia jednak faktu, że zachowanie:
Cytat
Script line: 19 Trigger does not exist
Script line: 20 Trigger does not exist
Script line: 28 Trigger already exists
Script line: 34 Trigger already exists

jest co najmniej niezrozumiałe...
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.